Android SharedPreferences / PreferenceFragment无效

时间:2014-01-23 11:21:07

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

我最近研究了有关使用共享首选项处理应用程序首选项的部分以及 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”并按下确定。现在,据我所知,文档中,首选项应自动保存到共享首选项中。当我重新打开EditText对话框时,我看到我的更改已存储。

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

1 个答案:

答案 0 :(得分:4)

在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,而id又将用作键:

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