android - 如何监听 PreferenceFragment 中的偏好变化?

标签 android android-fragments android-activity sharedpreferences android-preferences

如所述here ,我将 PreferenceFragment 子类化并在 Activity 中显示它。该文档解释了如何监听偏好变化here ,但前提是您将 PreferenceActivity 子类化。既然我不这样做,我如何倾听偏好变化?

我尝试在我的 PreferenceFragment 中实现 OnSharedPreferenceChangeListener,但它似乎不起作用(onSharedPreferenceChanged 似乎从未被调用)。

这是我目前的代码:

SettingsActivity.java

public class SettingsActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        // Display the fragment as the main content.
        getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
    }
}

SettingsFragment.java

public class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener
{
    public static final String KEY_PREF_EXERCISES = "pref_number_of_exercises";

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

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
    {
        //IT NEVER GETS IN HERE!
        if (key.equals(KEY_PREF_EXERCISES))
        {
            // Set summary to be the user-description for the selected value
            Preference exercisesPref = findPreference(key);
            exercisesPref.setSummary(sharedPreferences.getString(key, ""));
        }
    }
}

preferences.xml

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

    <EditTextPreference
        android:defaultValue="15"
        android:enabled="true"
        android:key="pref_number_of_exercises"
        android:numeric="integer"
        android:title="Number of exercises" />

</PreferenceScreen>

另外,PreferenceFragment 是否是监听偏好变化的正确位置,还是应该在 Activity 中进行?

最佳答案

我相信您只需要在 PreferenceFragment 中注册/取消注册 Listener 即可。

@Override
public void onResume() {
    super.onResume();
    getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

}

@Override
public void onPause() {
    getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    super.onPause();
}

根据您想要做什么,您可能不需要使用监听器。对首选项的更改会自动提交到 SharedPreferences

关于android - 如何监听 PreferenceFragment 中的偏好变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13596250/

相关文章:

android - 无法在 editText 上打开键盘

android - 刷新消息队列以防止基于消息的泄漏。但是要刷新哪个 HandlerThread?

Android/Koin - 如何告诉 koin 应该重新初始化单个依赖项

java - 是否从 MainActivity 和 fragment 复制线程启动服务?

android - 停止并取消绑定(bind) Android 中不同 Activity 的服务

java - 带有空值的 Couchbase lite 复合键范围

java - 放置自动完成 fragment 在 Android 5.0 及更高版本上不起作用

android - 共享项目转换在背面的 fragment 中不起作用

java - 是否可以像在 android 中一样为我的应用程序的 Activity 创建一个最近的屏幕

java - 从 ListView 中选择一个项目