java - Android SharedPreferences/PreferenceFragment 不工作

标签 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/

问题

简单明了的东西,嗯?我启动了该应用程序,转到了首选项菜单/Activity ,首选项 fragment 膨胀了,我点击了“Api Base Uri”。弹出EditText对话框,我将“http://acme.com/api”更改为“http://acme.com/api2"并按下 OK。现在,据我对文档的理解,首选项应该自动保存到共享首选项中。当我重新打开 EditText 对话框时,我看到我的更改已存储。

但是......当我关闭 Activity (或应用程序)并返回设置时,默认值又回来了,没有进行任何更改!我该怎么做才能永久保存我的设置?

最佳答案

在您的 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" />

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

This attribute is required for preferences that persist a data value. It specifies the unique key (a string) the system uses when saving this setting's value in the SharedPreferences.

您的 pref_key_apiBaseUri 似乎是一个空字符串。将其更改为有效的字符串并移至 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"
    ...

关于java - Android SharedPreferences/PreferenceFragment 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21306677/

相关文章:

ios - 以编程方式在 iOS 中启动新 Activity

java - 安卓Java : Using setOnClickListener in for loop

java - Golang - gomobile 基本脚本编译错误

android - android初学者有必要使用android中的MVVM模式或架构组件吗?

java - 使用服务时发生 ClassCastException

php - 我的 Activity 页面没有结果

java - ConnectionShutdownException 是什么意思以及如何防止它?

Java集合: Map getting updated while using fail-safe iterator

java - ImageView 尺寸看起来比实际尺寸小

android - 关闭网格项目上的 Activity 单击android?