代码之家  ›  专栏  ›  技术社区  ›  Peterdk

Android首选项:当用户没有使用首选项屏幕时,如何加载默认值?

  •  108
  • Peterdk  · 技术社区  · 16 年前

    我使用PreferenceActivity让用户设置一些值。

    我已经把所有的 android:defaultValue="" 为了他们。

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    boolean value = prefs.getBoolean("key"), false); 
    

    但是,什么时候 android:defaultValue="true" 我还是能理解 false

    getBoolean() 方法。那么,有没有办法只在一个地方定义默认值?

    5 回复  |  直到 16 年前
        1
  •  181
  •   Gk Mohammad Emon J. Jefferson    6 年前

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

    用这个代码就行了 onCreate 方法:

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

    readAgain )将保证用户的首选项不会被覆盖。这意味着设置 再读一遍 论据 false 这意味着只有在过去从未调用过此方法时,才会设置默认值,因此您不必担心每次创建活动时都会覆盖用户的设置

    看一看 PreferenceManager.setDefaultValues

        2
  •  27
  •   Darpan    14 年前


    getSharedPreferences(String sharedPreferencesName, int sharedPreferencesMode)


    PreferenceManager.setDefaultValues(Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)
    设置默认值!

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

    我希望这能帮助别人。

        3
  •  13
  •   Steve Waring    12 年前

    在Pixel的公认答案中:

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

    据说 false true

    如果您担心效率,可以编写这样的代码。

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

    如果您添加了更多共享首选项,只需将SPL设置为一个较高的数字。

        4
  •  2
  •   Macarse    16 年前

    例如扩展 DialogPreference

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

    mDefault可以是:

    • mContext.getResources().getString(attrs.getAttributeResourceValue(androidns,“defaultValue”,100));
    • 你在R中索引的东西。
        5
  •  0
  •   wirthra    9 年前

        6
  •  0
  •   Yessy    6 年前

    define类扩展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());
        }
    }
    

    定义首选项XML资源

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

    然后初始化默认值并访问

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

    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