Where to store Android preference keys?

JavaAndroidAndroid Preferences

Java Problem Overview


When I create preference activity I define all preferences in xml file. Every preference has a key defined in this xml. But when I access preference I write:

SharedPreferences appPreferences = PreferenceManager.getDefaultSharedPreferences(this);
boolean foo_value = appPreferences.getBoolean("foo_key_defined_in_xml", false);

Is there any way to avoid referencing "foo_key_defined_in_xml" in hard-coded way? Maybe there is a possibility to reference it in R style way (not to refer to string)?

Java Solutions


Solution 1 - Java

I've found that it's possible to store keys in strings.xml and refer to them from preferences.xml just like all other values android:key="@string/preference_enable".

In code you can refer to key by typing getString(R.string.preference_enable)

You can mark the string to not be translated using a <xliff:g> tag. See Localization Checklist

<string name="preference_enable"><xliff:g id="preference_key">enable</xliff:g></string>

Solution 2 - Java

You could use a "keys.xml" files in "res/values", but should put something like this, this way you should dont have problem when you are using multiple languages:

    <resources
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="MissingTranslation">

    <string name="key1">key1</string>
    <string name="key2">key2</string>
...
</resources>

Then you could reference it like a normal string in xml:

....
android:key="@string/key1"
....

or in your java code for example:

SwitchPreference Pref1= (SwitchPreference) getPreferenceScreen().findPreference(getString(R.string.key1));

Solution 3 - Java

In strings.xml mark the key as untranslatable:

<string name="screw_spacing_key" translatable="false">Screw spacing</string>
<string name="screw_spacing_title">Screw spacing</string>
<string name="screw_spacing_summary">Set screw spacing</string>

Usage:

<EditTextPreference
    android:key="@string/screw_spacing_key"
    android:title="@string/screw_spacing_title"
    android:summary="@string/screw_spacing_summary"/>

See: Configure untranslatable rows

Solution 4 - Java

As far as I know there's no better way of referencing preference keys (aside from maybe using a static final String to store the string on the class).

The example given in the SDK docs does the same as what you've given in your example,

Solution 5 - Java

Try getString(R.string.key_defined_in_xml).

Solution 6 - Java

What about using a helper class to hide the getString() - instantiate the helper once in each activity or service. For example:

class Pref {

    final String smsEnable_pref;
    final String interval_pref;
    final String sendTo_pref;
    final String customTemplate_pref;
    final String webUrl_pref;

    Pref(Resources res) {       
         smsEnable_pref = res.getString(R.string.smsEnable_pref);
         interval_pref = res.getString(R.string.interval_pref);
         sendTo_pref = res.getString(R.string.sendTo_pref);
         customTemplate_pref = res.getString(R.string.customTemplate_pref);
         webUrl_pref = res.getString(R.string.webUrl_pref);
    }
}

Solution 7 - Java

Not sure if this post need another answer, put i end up to it like this:

-Extend all the Preference needed and add this code

   final static private int[] ATTR_INDEX = {android.R.attr.id};
    private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){
        if(attrs == null) return;
        AttributeReader attributes = new AttributeReader().setAttrsIndex(ATTR_INDEX).parse(attrs);
        int id = attributes.asResourceID(0);
        setKey(AppContext.getIdentifierName(id));
    }
  • In the xml, don't use the key attribute but android:id="@+id/...

  • And finally to get back the value,

    SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(getContext()); String preference_1 = SP.getString(AppContext.getIdentifierName(R.id.pref_key_1), null);

This way, you don't have to create a string file who need to be maintain, just create any id on the fly. But you need to be familiar with extending a view and get read the attr to find what you want (Here the id attribute)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionpixelView Question on Stackoverflow
Solution 1 - JavapixelView Answer on Stackoverflow
Solution 2 - JavaNico PedrazaView Answer on Stackoverflow
Solution 3 - JavaJeffreyView Answer on Stackoverflow
Solution 4 - JavaAdrianView Answer on Stackoverflow
Solution 5 - JavamolnarmView Answer on Stackoverflow
Solution 6 - JavaMichael HamiltonView Answer on Stackoverflow
Solution 7 - Javauser4752077View Answer on Stackoverflow