【问题标题】:Android: Can't load default values from a preferences xml file using sharedpreferencesAndroid:无法使用 sharedpreferences 从首选项 xml 文件加载默认值
【发布时间】:2012-04-24 00:41:56
【问题描述】:

尝试从preference.xml 文件加载默认值。并使用 sharedpreferences 加载它们,但 xml 文件中的 defaultValues 不会为我加载。这是我的代码。

/res/xml/prefs.xml

   <?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:key="prefs" android:title="prefs">
        <Preference android:key="bild" android:title="bild" android:defaultValue="This is bild,0,false"/>
        <Preference android:key="bild2" android:title="bild2" android:defaultValue="This is bild2,1,false"/>
        <Preference android:key="bild3" android:title="bild3" android:defaultValue="This is bild3,2,false"/>
    </PreferenceScreen>

Android 代码:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);
    PreferenceManager.setDefaultValues(this, R.xml.prefs, false);
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    String picture = prefs.getString("bild", "dosen't exist");
    Log.e("test", "This is the picture Value: " + picture);
}

它总是打印“dosent't exist”,这意味着在这个例子中它没有正确加载?并且无法弄清楚为什么会这样。

任何帮助将不胜感激,谢谢

/艾多尔

【问题讨论】:

    标签: android sharedpreferences default-value android-preferences


    【解决方案1】:

    根据this 的问题,您共享首选项文件的位置错误。另外,如果我没记错(感觉不太好,所以可能记错了),如果你想读取带有键值对的文件,最好将它们放在 assets 文件夹中并从那里读取。

    【讨论】:

    • 嗯,如果我没有误解它的话。根据另一个问题,他想知道共享偏好存储在设备上的什么位置。就我而言,我想在应用程序首次启动时加载默认的共享首选项。不确定这里但将文件存储在我认为正确的资产中,但元信息应以其他方式存储。感谢您的宝贵时间!
    【解决方案2】:

    我认为保存在 prefs.xml 中的首选项没有任何问题。在重新创建您的代码并稍微修改它之后,我不得不怀疑普通的 -Tag

    strings.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <string name="app_name">TestPreference</string>
        <string name="action_settings">Settings</string>
        
        <string name="pref_header_1">Preference Category</string>
        
        <string name="pref_default_1">Image 1</string>
        <string name="pref_default_2">Image 2</string>
        
        <string name="pref_title_1">Title 1</string>
        <string name="pref_title_2">Title 2</string>
        <string name="pref_title_3">Title 3</string>
        
        <string name="pref_key_1">pref_key_1</string>
        <string name="pref_key_2">pref_key_2</string>
        <string name="pref_key_3">pref_key_3</string>
    
        <string-array name="pref_entries_3">
            <item>One</item>
            <item>Two</item>
            <item>Five</item>
        </string-array>
        <string-array name="pref_values_3">
            <item>1</item>
            <item>2</item>
            <item>3</item>
        </string-array>
    </resources>
    

    preference.xml

    <?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <PreferenceCategory android:title="@string/pref_header_1" >
            <Preference
                android:defaultValue="@string/pref_default_1"
                android:key="@string/pref_key_1"
                android:title="@string/pref_title_1" />
    
            <EditTextPreference
                android:defaultValue="@string/pref_default_2"
                android:key="@string/pref_key_2"
                android:title="@string/pref_title_2" />
    
            <ListPreference
                android:defaultValue="1"
                android:entries="@array/pref_entries_3"
                android:entryValues="@array/pref_values_3"
                android:key="@string/pref_key_3"
                android:negativeButtonText="@null"
                android:positiveButtonText="@null"
                android:title="@string/pref_title_3" />
        </PreferenceCategory>
    
    </PreferenceScreen>
    

    MainActivity.java

    private Logger log = LoggerFactory.getLogger(getClass());
    
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        // Get default preferences and load default values
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        PreferenceManager.setDefaultValues(this, R.xml.preference, false);
    
        // Check if keys exist in sharedPreferences
        log.debug("Contains keys #1: {}; #2: {}; #3: {}", new Object[] {
                prefs.contains(getString(R.string.pref_key_1)),
                prefs.contains(getString(R.string.pref_key_2)),
                prefs.contains(getString(R.string.pref_key_3))
        });
    
        // Get preferences values
        String value1 = prefs.getString(getString(R.string.pref_key_1), "not found");
        String value2 = prefs.getString(getString(R.string.pref_key_2), "not found");
        String value3 = prefs.getString(getString(R.string.pref_key_3), "not found");
        log.debug("Values #1: {}; #2: {}; #3: {}", new Object[] { value1, value2, value3 });
    
        // prefs.edit().putString(getString(R.string.pref_key_1), getString(R.string.pref_default_1)).apply();
    }
    

    记录结果

    "Contains keys #1: false; #2: true; #3: true"
    "Values #1: not found; #2: Image 2; #3: 1"
    



    结论

    如果您希望某个首选项可供用户编辑,您可能最好使用 具体首选项,例如适合您需要的 EditTextPreference、ListPreference、CheckboxPreferencete (check here for a complete list of subclasses

    如果由于某种原因您仍想使用普通首选项,我想您必须像这样手动加载它们:

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
            prefs.edit().putString(getString(R.string.pref_key_1), getString(R.string.pref_default_1)).apply();
    

    【讨论】:

      猜你喜欢
      • 2011-07-02
      • 2012-09-28
      • 2011-02-11
      • 1970-01-01
      • 2014-04-29
      • 2016-10-01
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多