Search code examples
javaandroidandroid-preferences

Get and set preference values


My objective is manage my custom preferences. For this, I have the following code:

MainActivity.java

public class MainActivity extends ActionBarActivity implements View.OnTouchListener, GoogleMap.OnInfoWindowClickListener, LocationListener, GoogleMap.OnMapClickListener{

             public boolean onOptionsItemSelected(MenuItem item) {
                int id = item.getItemId();

                if (id == R.id.action_settings) {
                    launchPreferences(null);
                    return true;
                }

                return super.onOptionsItemSelected(item);
            }
            public void launchPreferences(View view) {
                Intent i = new Intent(this, Preferences.class);
                startActivity(i);
            }
    }

Preferences.java

public class Preferences extends PreferenceActivity {

    @Override protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.settings);

        updatePreference();


    }

settings.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:key="@+id/preferencias_principal" >
    <EditTextPreference
        android:key="@+id/perimer"
        android:title="Perimeter to list"
        android:summary="Maximum distance to list"
        android:defaultValue="2"/>
    <ListPreference
        android:key="@+id/leguage"
        android:title="Lenguage"
        android:summary="What language would you apply?"
        android:entries="@array/lenguage"
        android:entryValues="@array/lenguageva"
        android:defaultValue="1"/>

</PreferenceScreen>

arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="lenguage">
        <item>English</item>
        <item>Basque</item>
        <item>Spanish</item>
    </string-array>
    <string-array name="lenguageva">
        <item>1</item>
        <item>2</item>
        <item>3</item>
    </string-array>

    <string-array name="number">
        <item>1</item>
        <item>2</item>
        <item>3</item>
        <item>4</item>
        <item>5</item>
        <item>6</item>
        <item>7</item>
        <item>8</item>
        <item>9</item>
        <item>10</item>
        <item>11</item>
        <item>12</item>
        <item>13</item>
        <item>14</item>
        <item>15</item>
    </string-array>

</resources>

I want to get the values of this preference, using this code:

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
Integer peri = sharedPref.getInt("@+id/perimer", 1);
Integer leng = sharedPref.getInt("@+id/leguage", 2);

But this code return default values, peri=1 and leng=2.

Not only that, sometimes the information added by the preference activity is changed/deleted or in the ListPreference item is not appear the default item selected (as you can be seen in the image).

Interface result

When I execute the code visible here, with debugger, this is the result:

Debugger result

What can I do?

Thank you!


Solution

  • The main problem is the KEY @+id/perimer and @+id/leguage that you used for your EditTextPreference and ListPreference.

    SharedPreferences is unable to recognize it as preference KEY. As you added resource prefix @+id, its treated as int resource id that's why still it works with below lines but doing abnormal behavior and giving you incorrect output.

        Integer peri = sharedPref.getInt("@+id/perimer", 1); // WRONG
        Integer leng = sharedPref.getInt("@+id/leguage", 2); // WRONG
    

    SOLUTION:

    1. Do not use resource prefix @+id with preference KEY. Update your settings.xml as below:

    <?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <EditTextPreference
            android:key="perimer"
            android:title="Perimeter to list"
            android:summary="Maximum distance to list"
            android:defaultValue="2"/>
        <ListPreference
            android:key="leguage"
            android:title="Lenguage"
            android:summary="What language would you apply?"
            android:entries="@array/lenguage"
            android:entryValues="@array/lenguageva"
            android:defaultValue="1"/>
    
    </PreferenceScreen>
    

    2. Get preference values using SharedPreferences.getString(KEY_NAME, DEFAULT_VALUE).

        // Get current values
        String peri = mSharedPreferences.getString("perimer", "1");
        String leng = mSharedPreferences.getString("leguage", "2");
    

    3. Add OnPreferenceChangeListener to your preferences to get the updated values and update the preference summary if needed.

        // Required to get the updated value and update summary when you input distance
        mPreferencePerimer.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object value) {
                String peri = value.toString();
    
                //Update premier summary
                mPreferencePerimer.setSummary(peri);
    
                return true;
            }
        });
    
        // Required to get the updated value and update summary when you change language from list
        mPreferenceLeguage.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object value) {
    
                String leng = value.toString();
                int lengIndex = Integer.parseInt(leng) - 1;
    
                // Update leguage summary
                mPreferenceLeguage.setSummary(mPreferenceLeguage.getEntries()[lengIndex]);
                return true;
            }
        });
    

    Here is the full code:

    public class Preferences extends PreferenceActivity {
    
        // Preference Keys
        public static final String KEY_PREF_PERIMER = "perimer";
        public static final String KEY_PREF_LEGUAGE = "leguage";
    
        // Shared preference
        SharedPreferences mSharedPreferences;
    
        EditTextPreference mPreferencePerimer;
        ListPreference mPreferenceLeguage;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.settings);
    
            // Shared preference
            mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
    
            // Perimer
            mPreferencePerimer = (EditTextPreference) getPreferenceScreen().findPreference(KEY_PREF_PERIMER);
            // Leguage
            mPreferenceLeguage = (ListPreference) getPreferenceScreen().findPreference(KEY_PREF_LEGUAGE);
    
            // Get current values
            String peri = mSharedPreferences.getString(KEY_PREF_PERIMER, "1");
            String leng = mSharedPreferences.getString(KEY_PREF_LEGUAGE, "2");
            int lengIndex = Integer.parseInt(leng) - 1;
    
            // Set preference summary
            mPreferencePerimer.setSummary(peri);
            mPreferenceLeguage.setSummary(mPreferenceLeguage.getEntries()[lengIndex]);
    
            // Required to get the updated value and update summary when you input distance
            mPreferencePerimer.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
                @Override
                public boolean onPreferenceChange(Preference preference, Object value) {
                    String peri = value.toString();
    
                    //Update premier summary
                    mPreferencePerimer.setSummary(peri);
    
                    return true;
                }
            });
    
            // Required to get the updated value and update summary when you change language from list
            mPreferenceLeguage.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
                @Override
                public boolean onPreferenceChange(Preference preference, Object value) {
    
                    String leng = value.toString();
                    int lengIndex = Integer.parseInt(leng) - 1;
    
                    // Update leguage summary
                    mPreferenceLeguage.setSummary(mPreferenceLeguage.getEntries()[lengIndex]);
                    return true;
                }
            });
        }
    }
    

    OUTPUT:

    DEFAULT STATE

    enter image description here

    AFTER CHANGE

    enter image description here

    Hope this will help~