android - 监听 MainActivity 中的 SharedPreferences 更改

标签 android android-preferences android-sharedpreferences

我正在尝试监听 MainActivity 中的 SharedPreferences 更改。并更新应用程序设置中的值。工作代码如下:

private SharedPreferences SP, prefs;
SharedPreferences.OnSharedPreferenceChangeListener mListener;
SP = PreferenceManager.getDefaultSharedPreferences(getBaseContext());

mListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {

        Toast.makeText(MainActivity.this, "Key changed: "+key, Toast.LENGTH_SHORT).show();
    }
};

SP.registerOnSharedPreferenceChangeListener(mListener);

但是当我尝试像这样更改键值时。它说无法解析 findPreference 方法。我尝试使用上下文执行此操作,但错误仍然存​​在。

private SharedPreferences SP, prefs;
SharedPreferences.OnSharedPreferenceChangeListener mListener;
SP = PreferenceManager.getDefaultSharedPreferences(getBaseContext());

mListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {

            if (key.equals("username")) {
                Preference pref = findPreference(key);
                pref.setDefaultValue(prefs.getString(key, "bob"));    }
};
SP.registerOnSharedPreferenceChangeListener(mListener);

我们如何导入MainActivity中的方法定义。请告诉我在这里改变值(value)的方式是否正确?

设置.java

import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.os.Bundle;

public class Settings extends PreferenceActivity {



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit();
    }

    public static class MyPreferenceFragment extends PreferenceFragment
    {
        PrefManager prefManager;
        @Override
        public void onCreate(final Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);
        }
    }

}

首选项.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <EditTextPreference android:title="Your Name"
        android:key="username"
        android:summary="Please provide your username">
    </EditTextPreference>


</PreferenceScreen>

我基本上想在代码中更改键“username”的SharedPreferences时更新设置页面中的首选项。

最佳答案

You must implement PreferenceActivity in your activity

在您的 Activity 名称后添加extends PreferenceActivity,然后导入其命名空间:

public class MainActivity extends PreferenceActivity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      ...
   }
}

有关更多信息,请查看http://developer.android.com/reference/android/preference/PreferenceActivity.html

已编辑

使用以下代码:

public class Settings extends PreferenceActivity  {

    private SharedPreferences SP;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit();

        SharedPreferences.OnSharedPreferenceChangeListener mListener;
        SP = PreferenceManager.getDefaultSharedPreferences(getBaseContext());

    }

    public static class MyPreferenceFragment extends PreferenceFragment implements
            SharedPreferences.OnSharedPreferenceChangeListener{
        @Override
        public void onCreate(final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);
        }

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

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

        public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
            if (key.equals("username")) {
                Preference pref = findPreference(key);
                pref.setDefaultValue(prefs.getString(key, "bob"));
            }
        }
    }
}

关于android - 监听 MainActivity 中的 SharedPreferences 更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38180577/

相关文章:

android - 带有图标的弹出菜单

Android Studio 无法访问其他类中的函数

android - 如何设置 ViewPager 大小

java - 更改 EditTextPreference 的对话框消息颜色

java - 使用 SharedPreferences.contains() 时 Android 应用程序崩溃

android - android上多行标题的偏好

android - 避免与Google帐户共享付费应用

Android 偏好设置似乎忽略了 setDefaultValue

android - android中的动态ListPreference

Android 共享首选项不能正确保存