pixel
pixel

Reputation: 26441

Where to store Android preference keys?

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)?

Upvotes: 64

Views: 18035

Answers (7)

user4752077
user4752077

Reputation:

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)

Upvotes: 0

Jeffrey
Jeffrey

Reputation: 2106

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

Upvotes: 5

pixel
pixel

Reputation: 26441

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>

Upvotes: 75

Nico Pedraza
Nico Pedraza

Reputation: 155

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));

Upvotes: 15

Michael Hamilton
Michael Hamilton

Reputation: 586

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);
    }
}

Upvotes: 1

Adrian
Adrian

Reputation: 2123

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,

Upvotes: 1

molnarm
molnarm

Reputation: 10031

Try getString(R.string.key_defined_in_xml).

Upvotes: 1

Related Questions