【问题标题】:Android SharedPreferences/PreferenceFragment not workingAndroid SharedPreferences/PreferenceFragment 不起作用
【发布时间】:2014-02-13 21:54:21
【问题描述】:

我最近研究了Android 开发者文档中关于使用共享首选项PreferenceFragment处理应用程序首选项的部分,并做了以下简单示例:

SettingsActivity.java

public class SettingsActivity extends PreferenceActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if(savedInstanceState == null)
            getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new SettingsFragment())
                .commit()

    }

}

SettingsFragment.java

public class SettingsFragment extends PreferenceFragment {

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

}

res/xml/settings.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <PreferenceCategory android:title="@string/pref_general_category">    

        <EditTextPreference
            android:key="@id/pref_key_apiBaseUri"
            android:title="@string/pref_apiBaseUri_title"
            android:defaultValue="@string/pref_apiBaseUri_default"
            android:persistent="true"
            android:inputType="text"
            android:singleLine="true" />

    </PreferenceCategory>

</PreferenceScreen>

其他内容:

id        pref_key_apiBaseUri
string    pref_apiBaseUri_title       "Api Base Uri"
string    pref_api_baseUri_default    "http://acme.com/api/

问题

直截了当的东西,嗯?我启动了应用程序,进入了首选项菜单/活动,首选项片段被夸大了,我点击了“Api Base Uri”。弹出一个EditText 对话框,我将“http://acme.com/api”更改为“http://acme.com/api2”并按下OK。现在,据我了解文档,首选项应该会自动保存到共享首选项中。当我重新打开 EditText 对话框时,我看到我的更改已存储。

但是.. 当我关闭活动(或应用程序)并返回设置时,默认值又恢复了,没有进行任何更改!如何永久保存我的设置?

【问题讨论】:

    标签: java android android-activity sharedpreferences android-preferences


    【解决方案1】:

    在您的 settings.xml 中,您有:

    <EditTextPreference
        android:key="@id/pref_key_apiBaseUri"
        android:title="@string/pref_apiBaseUri_title"
        android:defaultValue="@string/pref_apiBaseUri_default"
        android:persistent="true"
        android:inputType="text"
        android:singleLine="true" />
    

    您必须为密钥指定一个字符串,正如 android:key 的文档所说:

    持久化数据值的首选项需要此属性。它指定系统在 SharedPreferences 中保存此设置的值时使用的唯一键(字符串)。

    您的 pref_key_apiBaseUri 似乎是一个空字符串。将其更改为有效的 String 并移至 strings.xml:

    <string name="pref_key_apiBaseUri">KEY</string>
    

    然后用作:

    <EditTextPreference
        android:key="@string/pref_key_apiBaseUri"
        ...
    

    或者保持原样,只需在 id 标签前添加+,这将创建 id 反过来将用作 key:

    <EditTextPreference
        android:key="@+id/pref_key_apiBaseUri"
        ...
    

    【讨论】:

    • 我在 /res/values/ids.xml 中定义了我的 id 如下:&lt;item type="id" name="pref_key_apiBaseUri" /&gt;。这不应该工作吗?
    • 我明白了。我不确定为什么它不起作用。我可以在文档中看到,他们只使用字符串,而不是对 id 的引用,而且您的问题似乎出在 android:key 元素中,如上所述...
    • 呵呵,你说得对。引用的 id 似乎不起作用,尽管这很有趣,因为设置键应该是唯一的,因此是一个 id。使用字符串解决了我的问题,谢谢。
    • 非常感谢。我花了很多时间对此感到困惑,唉......我忘记了几个偏好的关键。不会再忘记了:)
    猜你喜欢
    • 2016-12-03
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2013-07-03
    相关资源
    最近更新 更多