我共享的pref听众不会听

时间:2014-12-04 03:01:02

标签: android sharedpreferences

我已关注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()方法,我会看到我的吐司。 / p>

这个简单的让我难过。

1 个答案:

答案 0 :(得分:2)

您正在将您的听众注册为错误的偏好。

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();
}