Android 我的共享pref侦听器不会';听

Android 我的共享pref侦听器不会';听,android,sharedpreferences,Android,Sharedpreferences,我关注了Google开发文档,并提出了以下共享首选项活动: public class SettingsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener { @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstance

我关注了Google开发文档,并提出了以下共享首选项活动:

public class SettingsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {


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

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


    public static class SettingsFragment extends PreferenceFragment {
        @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) {
        // TODO Auto-generated method stub
        Toast.makeText(this, "Pref changed", Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onResume() {
        super.onResume();
        getApplicationContext().getSharedPreferences(this.getLocalClassName(), MODE_PRIVATE).registerOnSharedPreferenceChangeListener(this);
        //Toast.makeText(this, "registered pref listener", Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onPause() {
        super.onPause();
        getApplicationContext().getSharedPreferences(this.getLocalClassName(), MODE_PRIVATE).unregisterOnSharedPreferenceChangeListener(this);
    }

}
正如您所看到的,我在onSharedPreferenceChanged方法中有一个简单的toast消息,因此我可以看到它在工作,但它似乎不工作

与Google文档的唯一区别是,我在onResume()中使用getApplicationContext()而不是getPreferenceScreen(),因为getPreferenceScreen()显示为已弃用

我只需要弄清楚为什么它没有监听——我的首选项屏幕上满是复选框,所以我假设,当我单击其中任何一个复选框时,会调用onSharedPreferenceChanged()方法,我会看到我的toast


这个简单的问题把我难住了。

你给你的听众注册了一个错误的偏好

SettingsFragment中从XML资源加载的首选项使用默认共享首选项,因此您应该像下面这样注册侦听器:

@Override
public void onResume() {
  super.onResume();
  SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
  pref.registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause() {
  SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
  pref.unregisterOnSharedPreferenceChangeListener(this);
  super.onPause();
}