Android:SharedPreference:启动时未设置默认值

问题描述 投票:0回答:4

我的应用程序中有列表首选项。它们似乎没有在安装后立即设置为默认值 - 它们似乎为空。我试图找出为什么安装后没有立即设置我的默认首选项。在我的主要代码中我有:

      SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);

      InUnits = sp.getString("List1", "defValue");
       InAngs = sp.getString("List2", "defValue");
       OutUnits = sp.getString("List3", "defValue");
       OutAngs = sp.getString("List4", "defValue");

上述代码执行后,每个变量都包含“defValue”,而不是我在下面的 ListPreference 中分配的实际值。

我的首选项 xml 文件称为“settings.xml”。这是其中一个 ListPreferences 的样子:

       <ListPreference
       android:key="List1"
       android:title="Input: Alph"
       android:summary="Choose Alph or Ralph"
       android:entries="@array/inputAlph"
       android:entryValues="@array/input_Alph_codes"
       android:dialogTitle="Input Alph"
       android:defaultValue="ININ"/>           

这是我的一些 strings.xml 文件的样子:

<string-array name="inputUnits">
    <item>Alph</item>
    <item>Ralph</item>  
    </string-array>   
    <string-array name="input_Alph_codes">
    <item>ININ</item>
    <item>INMM</item>
    </string-array>

当我进入菜单,然后进入设置时,我可以看到我的默认值已选中(单选按钮)。然后,当我从设置菜单返回主屏幕时 - 一切都很好 - 终生! ...然后上面的每个变量都被分配了正确的默认值。

只有当我第一次在手机上安装应用程序时才会发生这种情况。当我进入设置屏幕一次然后直接退出后,该应用程序就很好并且接受任何设置更改。

顺便说一句,正如您所看到的,“List1”是我的 res/xml 文件夹中名为 settings.xml 的文件中的 android:key。

android default-value android-preferences
4个回答
23
投票

他们似乎没有设置 他们的默认值之后 安装 - 它们似乎为空。

这就是应该发生的事情。

我试图找出为什么我的 未设置默认首选项 安装后。

他们不应该这样。您在那里列出的首选项 XML 仅用于填充

PreferenceActivity
,仅此而已。在用户打开
PreferenceActivity
之前,首选项将为空,并且将返回您提供给
SharedPreferences
getter 的默认值。


更新

您可以使用

setDefaultValues()
上的
PreferenceManager
将首选项 XML 中的默认值分配给
SharedPreferences
。但是,请注意时间安排——这将执行磁盘 I/O,因此最好在后台线程上执行。


12
投票

从您的首选项 XML 将默认值设置为 SharedPreferences。

PreferenceManager.setDefaultValues(Context context, int resourceId, boolean readAgain)

PreferenceManager.setDefaultValues


0
投票

应该检查

PreferenceManager.KEY_HAS_SET_DEFAULT_VALUES

/** Apply default values, as defined in XML. */
private void setDefaultValues(@XmlRes int resId) {
    String name = PreferenceManager.KEY_HAS_SET_DEFAULT_VALUES;
    if (! getSharedPreferences(name, Context.MODE_PRIVATE).getBoolean(name, false)) {
        PreferenceManager.setDefaultValues(this, resId, true);
        Log.d(LOG_TAG, "default values have been set");
    }
}

-3
投票

您可以像这样指定默认值

SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
pref.getString("thePrefKey", "theDefaultValue");

“布局”settings.xml 中的 android:defaultValue="..." 只是对用户的视觉帮助

© www.soinside.com 2019 - 2024. All rights reserved.