Skip to content
This repository has been archived by the owner on Feb 26, 2023. It is now read-only.

PreferenceHelpers

Kay-Uwe Janssen edited this page Oct 9, 2016 · 8 revisions

Since AndroidAnnotations 3.3

@PreferenceScreen

The @PreferenceScreen annotation adds the preference layout to the component. This annotation only can be used on subclasses of PreferenceActivity or PreferenceFragment, and the annotated must have @EActivity or @EFragment according to the type.

The annotation value should be an XML resource id referencing the preference layout.

Usage example:

@PreferenceScreen(R.xml.settings)
@EActivity
public class SettingsActivity extends PreferenceActivity {

    @PreferenceByKey(R.string.myPref1)
    Preference myPreference1;

    @PreferenceByKey(R.string.checkBoxPref)
    CheckBoxPreference checkBoxPref;

    @AfterPreferences
    void initPrefs() {
        checkBoxPref.setChecked(false);
    }
}

Please note if you are also using @ViewById and @AfterViews, you may have to guard for null. Refer to this thread for more information.

Since AndroidAnnotations 3.3.1

@PreferenceScreen can be also used on android.support.v4.PreferenceFragment and com.github.machinarius.preferencefragment.PreferenceFragment. Please note these are not official Android classes, but unfortunately PreferenceFragment is not yet available in the official Support Library.

@PreferenceByKey

This annotation can be used to inject a Preference or Preference subclass object to the annotated field. This annotation only can be used in subclasses of PreferenceActivity or PreferenceFragment, and the annotated must have @EActivity or @EFragment according to the type.

The annotation value must be a string resource id, referencing the key of the preference.

The injected preferences will be first available in @AfterPreferences annotated methods.

Usage example:

@EActivity
public class SettingsActivity extends PreferenceActivity {

    @PreferenceByKey(R.string.myPref1)
 	Preference myPreference1;
 
 	@PreferenceByKey(R.string.checkBoxPref)
 	CheckBoxPreference checkBoxPref;
 
 	@AfterPreferences
 	void initPrefs() {
 		checkBoxPref.setChecked(false);
 	}
}

Method based injection

Since AndroidAnnotations 4.0.0

@EActivity
public class SettingsActivity extends PreferenceActivity {

  @PreferenceByKey(R.string.myPref1)
  void setOnePreference(Preference myPreference1){
    // do something with myPreference1
  }
  
   void setMultiplePreferences(@PreferenceByKey(R.string.myPref1) Preference myPreference1, @PreferenceByKey(R.string.checkBoxPref) CheckBoxPreference checkBoxPref){
    // do something with myPreference1 and checkBoxPref
  }

}

@PreferenceChange

The @PreferenceChange annotation indicates that the annotated method will be called when the corresponding Preference is about to be changed, and will receive events defined by OnPreferenceChangeListener.onPreferenceChange.

The annotation value should be one or several R.string.* fields that refers to Preference or subclasses of Preference. If not set, the method name will be used as the R.string.* field name.

The method MAY have multiple parameters:

  • A Preference parameter to know which preference was targeted by this event
  • An Object, or Set of Strings, or String to obtain the new value of the Preference

Usage example:

@PreferenceChange(R.string.myPref)
void checkedChangedOnMyButton(boolean newValue, Preference preference) {
    // Something Here
}

@PreferenceChange
void myPrefPreferenceChanged(Preference preference) {
    // Something Here
}

@PreferenceChange({R.string.myPref1, R.string.myPref2})
void preferenceChangeOnMultiplePrefs(Preference preference, String newValue) {
    // Something Here
}

@PreferenceChange(R.string.myPref)
void preferenceChangeOnMyPref() {
    // Something Here
}

Since AndroidAnnotations 3.3.1

Float, Integer, Long and corresponding primitive types are now supported for the newValue parameter. Because Android Preference classes use Strings instead of Numbers, AndroidAnnotations automatically parses it and pass the Number object to the @PreferenceChange annotated method.

Usage example:

@PreferenceChange(R.string.myPref1)
void preferenceChangeIntParameter(Preference preference, int newValue) {
    // Something Here
}

Since AndroidAnnotations 4.0.0

As of AndroidAnnotations 4.0.0 any subclass of Preference can be passed to the methods (eg. ListPreference).

@PreferenceClick

The @PreferenceClick annotation indicates that the annotated method will be called when the corresponding Preference is clicked by the user, and will receive events defined by OnPreferenceClickListener#onPreferenceClick.

The annotation value should be one or several R.string.* fields that refers to Preference or subclasses of Preference. If not set, the method name will be used as the R.string.* field name.

The method MAY have one parameter:

  • A Preference parameter to know which preference was clicked

Usage example:

@PreferenceClick(R.string.myPref)
void clickOnMyPref() {
    // Something Here
}
 
@PreferenceClick
void myPrefPreferenceClicked(Preference preference) {
    // Something Here
}

Since AndroidAnnotations 4.0.0

As of AndroidAnnotations 4.0.0 any subclass of Preference can be passed to the methods (eg. ListPreference).

@PreferenceHeaders

@PreferenceHeaders can be used on an @EActivity annotated subclass of PreferenceActivity, to inject the preference headers from resource.

The annotation value should be one of R.xml.* fields.

Usage example:

@PreferenceHeaders(R.xml.preference_headers)
@EActivity
public class SettingsActivity extends PreferenceActivity {
 
    @PreferenceByKey(R.string.myPref1)
    Preference myPreference1;

    @PreferenceByKey(R.string.checkBoxPref)
    CheckBoxPreference checkBoxPref;
 
    @AfterPreferences
 	void initPrefs() {
        checkBoxPref.setChecked(false);
    }
}

@AfterPreferences

Methods annotated with @AfterPreferences will be called after addPreferenceFromResource is called by the generated classs.

This occurs AFTER addPreferenceFromResource which is called at the end of super.onCreate(). Any preference depending code should be done in an @AfterPreferences annotated method.

Usage example:

@EActivity
public class SettingsActivity extends PreferenceActivity {
 
    @PreferenceByKey(R.string.checkBoxPref)
    CheckBoxPreference checkBoxPref;
 
    @AfterPreferences
    void initPrefs() {
        checkBoxPref.setChecked(false);
    }
}

Using AndroidAnnotations

Questions?

Enjoying AndroidAnnotations

Improving AndroidAnnotations

Extending AndroidAnnotations

Clone this wiki locally