Android Preferences: How to load the default values when the user hasn't used the preferences-screen?

后端 未结 6 1166
春和景丽
春和景丽 2020-11-28 02:02

I am using a PreferenceActivity to let the user set some values. I am feeding it the xml file with the defined preferences.

I have set all the android:defaultV

相关标签:
6条回答
  • this question is similar to mine:

    initialize-preferences-from-xml-in-main-activity

    Just use this code in onCreate method:

    PreferenceManager.setDefaultValues(this, R.xml.preference, false);
    

    It will load your preferences from XML, and last parameter (readAgain) will guarantee that user preferences won't be overwritten. That means setting the readAgain argument to false means this will only set the default values if this method has never been called in the past so you don't need to worry about overriding the user's settings each time your Activity is created

    Take a look into PreferenceManager.setDefaultValues in Android API for further investigation.

    0 讨论(0)
  • 2020-11-28 02:18

    in Pixel's accepted answer:

    PreferenceManager.setDefaultValues(this, R.xml.preference, false);
    

    it is stated that the false means that defaults won't be overwritten. This is not what it does, it is just an efficiency flag to stop the parsing if your application has more than one entry point. Unfortunately the test is not made per preference file, so if you have more than one preference file you must code true on all but the first.

    If you are worried about efficiency, you could code something like this.

    final static private int SPL = 1;
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
    if (sp.getInt("spl", 0) != SPL)
    {
        PreferenceManager.setDefaultValues(this, R.xml.prefs1, true);
        PreferenceManager.setDefaultValues(this, R.xml.prefs2, true);
        sp.edit().putInt("spl", SPL).apply();
    }
    

    If you ever add more shared preferences, just set SPL to a hight number.

    0 讨论(0)
  • 2020-11-28 02:18

    For example extending DialogPreference I do this:

    @Override
    protected void onSetInitialValue(boolean restore, Object defaultValue) {
        super.onSetInitialValue(restore, defaultValue);
    
        if (restore) {
            mValue = shouldPersist() ? getPersistedString(mDefault) : mDefault;
        } else {
            mValue = mDefault;
        }
    }
    

    mDefault can be:

    • mContext.getResources().getString(attrs.getAttributeResourceValue(androidns,"defaultValue", 100));
    • something you have indexed in R.
    0 讨论(0)
  • 2020-11-28 02:30

    define class extends android.preference.Preference

    public class IntegerPreference extends Preference {
        public IntegerPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
        }
    
        public IntegerPreference(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        public IntegerPreference(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public IntegerPreference(Context context) {
            super(context);
        }
    
        @Override
        protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
            super.onSetInitialValue(restorePersistedValue, defaultValue);
            persistInt((Integer) defaultValue);
        }
    
        @Override
        protected Object onGetDefaultValue(TypedArray a, int index) {
            return a.getInt(index, -1);
        }
    }
    
    public class StringSetPreference extends Preference {
        public StringSetPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
        }
    
        public StringSetPreference(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        public StringSetPreference(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public StringSetPreference(Context context) {
            super(context);
        }
    
        @Override
        protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
            super.onSetInitialValue(restorePersistedValue, defaultValue);
            persistStringSet((Set<String>) defaultValue);
        }
    
        @Override
        protected Object onGetDefaultValue(TypedArray a, int index) {
            return Stream.of(a.getTextArray(index)).map(String::valueOf).collect(Collectors.toSet());
        }
    }
    

    define preference XML resource

    <?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
        <com.ainirobot.preferencetest.IntegerPreference
            android:defaultValue="101"
            android:key="III" />
        <com.ainirobot.preferencetest.FloatPreference
            android:defaultValue="1.2"
            android:key="FFF" />
        <com.ainirobot.preferencetest.StringPreference
            android:defaultValue="SSS"
            android:key="SSS" />
        <com.ainirobot.preferencetest.BooleanPreference
            android:defaultValue="True"
            android:key="BBB" />
        <com.ainirobot.preferencetest.StringSetPreference
            android:defaultValue="@array/sset"
            android:key="SSET" />
    </PreferenceScreen>
    

    then initialize default value and access

        PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
    
        Map<String, ?> allKeys = PreferenceManager.getDefaultSharedPreferences(this).getAll();
        int iii = PreferenceManager.getDefaultSharedPreferences(this).getInt("III", -1);
        float fff = PreferenceManager.getDefaultSharedPreferences(this).getFloat("FFF", 0);
        Log.d(TAG, "allKeys=" + allKeys + " iii=" + iii + " fff=" + fff);
    

    //Logcat

    10-13 06:53:06.986 12594 12594 D MainActivity: allKeys={III=101, BBB=true, SSS=SSS, FFF=1.2, SSET=[XXX, ZZZ, YYY]} iii=101 fff=1.2
    
    0 讨论(0)
  • 2020-11-28 02:39

    Also make sure you have never used the SharedPreferences before. To make sure they are not changed (which means setDefaultValues(this,xml,false) has no effect) uninstall your App and upload it again to be sure no values are touched. This helped me.

    0 讨论(0)
  • 2020-11-28 02:42

    Be aware that if you are using
    getSharedPreferences(String sharedPreferencesName, int sharedPreferencesMode)

    to retrieve preferences you have to use
    PreferenceManager.setDefaultValues(Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)
    to set defaults!

    For example:
    PreferenceManager.setDefaultValues(this, PREFS_NAME, Context.MODE_PRIVATE, R.xml.preference, false);

    I hope this can help someone.

    0 讨论(0)
提交回复
热议问题