SharedPreferencesHelpers
Since AndroidAnnotations 2.1
SharedPreferences helpers allow you to use Android SharedPreferences, but in a typesafe manner, instead of using strings.
First, you should create an interface annotated with @SharedPref
to define the SharedPreferences :
@SharedPref
public interface MyPrefs {
// The field name will have default value "John"
@DefaultString("John")
String name();
// The field age will have default value 42
@DefaultInt(42)
int age();
// The field lastUpdated will have default value 0
long lastUpdated();
}
Based on that specification, AndroidAnnotations builds a SharedPreferences Helper that has the same name plus an underscore. You can get an instance of the generated helper in any enhanced class with the @Pref
annotation.
Important: The type of the field MUST be the generated class instead of the source class. It's the only exception in AA.
@EActivity
public class MyActivity extends Activity {
@Pref
MyPrefs_ myPrefs;
// ...
}
Since AndroidAnnotations 4.0.0
@EActivity
public class MyActivity extends Activity {
@Pref
void setOnePref(MyPrefs_ myPrefs){
// do something with myPrefs
}
void setMultiplePrefs(@Pref MyPrefs_ myPrefs, @Pref AnotherPrefs_ anotherPrefs){
// do something with myPrefs and anotherPrefs
}
}
You can then start using it:
// Simple edit
myPrefs.name().put("John");
// Batch edit
myPrefs.edit()
.name()
.put("John")
.age()
.put(42)
.apply();
// Preference clearing:
myPrefs.clear();
// Check if a value exists:
boolean nameExists = myPrefs.name().exists();
// Reading a value
long lastUpdated = myPrefs.lastUpdated().get();
// Reading a value and providing a fallback default value
long now = System.currentTimeMillis();
long lastUpdated = myPrefs.lastUpdated().getOr(now);
Since AndroidAnnotations 3.0
It's now possible to inject a default value from Android resources with @DefaultRes
:
@SharedPref
public interface MyPrefs {
@DefaultRes(R.string.defaultPrefName)
String resourceName();
@DefaultRes // uses 'R.string.defaultPrefAge' to set default value
String defaultPrefAge();
}
Since AndroidAnnotations 3.1
You can specify a String resource by its id to be used as the preference key instead of the method name. This is useful when you specify your preferences in an xml file, and you use String resource keys there. Example:
@SharedPref
public interface MyPrefs {
@DefaultString(value = "John", keyRes = R.string.myPrefKey)
String name();
@DefaultRes(keyRes = R.string.myOtherPrefKey)
String defaultPrefAge();
}
Observe that you can name the shared preference by setting value
to one of the following:
-
ACTIVITY
, for a shared preference namedMyActivity_MyPrefs
; -
ACTIVITY_DEFAULT
, for a shared preference namedMyActivity
(also available throughactivity.getPreferences()
); -
APPLICATION_DEFAULT
, for the defaultSharedPreference
orUNIQUE
, for a shared preference namedMyPrefs
.
Therefore, if a single shared preference is needed for the interface defined, in order to all activities of a given application to share the same preferences, the following should be used:
@SharedPref(value=SharedPref.Scope.UNIQUE)
public interface MyPrefs {
...
The Android PreferenceActivity
or PreferenceFragment
can edit the values of your shared preferences.
@SharedPref(SharedPref.Scope.UNIQUE)
public interface MyPrefs {
...
}
public static String PREF_NAME = "MyPrefs";
// in onCreate
// Using your MyPrefs values
this.getPreferenceManager().setSharedPreferencesName(PREF_NAME);
// Opening the layout
addPreferencesFromResource(R.xml.prefs);
You may want to check out the @Preference API helpers.
19/11/2020 The 4.8.0 release is out !
- Get started!
- Cookbook, full of recipes
- Customize annotation processing
- List of all available annotations
- Release Notes
- Examples
- Read the FAQ
- Join the Mailing list
- Create an issue
- Tag on Stack Overflow
- Ask on Gitter