如何检测是否对首选项进行了更改?


76

我有一个扩展PreferenceActivity并显示我的应用程序首选项屏幕的类。是否可以检查是否对首选项进行了任何更改?

这有帮助...

http://developer.android.com/reference/android/content/SharedPreferences.OnSharedPreferenceChangeListener.html

其他相关文章: SharedPreferences.onSharedPreferenceChangeListener未被一致调用


public class PreferenceClass extends PreferenceActivity {

    OnSharedPreferenceChangeListener listener;

    public void onCreate(Bundle savedInstanceState) {
        SharedPreferences prefs = this.getSharedPreferences("settings", 0);
        listener = new SharedPreferences.OnSharedPreferenceChangeListener() {

            public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
                int flag = 1;
            }
        };
        prefs.registerOnSharedPreferenceChangeListener(listener);
        super.onCreate(null);
        addPreferencesFromResource(R.xml.settings);
    }
}

我认为可能会根据您的总体目标选择太多方向。您能提出一些有关检查时间和目的的细节吗?
R休斯

@嗯,我只想每次进行更改以执行某项操作时...只是找到了此链接stackoverflow.com/questions/2542938 / ... ...尽管仍然无法使其正常工作...侦听器中的方法从未被调用...有任何想法吗???
mixkat 2011年

不看代码,我只能猜测您犯了我似乎总是犯的相同错误。我建立了一个出色的听众,然后忘记将它附加到正确的对象上。另外,请确保将监听器附加到onCreate()方法中的对象上,或者至少在实际需要监听器监听之前,在运行的代码中附加该监听器。
R休斯

@RHughes No Im将侦听器附加到对象上... donno它有什么问题...它肯定在创建中...无论如何,感谢您的回复...
mixkat 2011年

Answers:


67

SharedPreferences.OnSharedPreferenceChangeListener spChanged = new
                           SharedPreferences.OnSharedPreferenceChangeListener() {
            @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
            String key) {
        // your stuff here
    }
};

在您的中PreferenceActivity,即使其成为您的PreferenceActivity类的成员,然后registerOnSharedPreferenceChangeListener(spChanged)PreferenceActivity.onCreate()方法中进行操作。

那就是我所做的,而且我从来没有问题。

否则,是您有条件地检查侦听器是否出错。发布代码。

编辑:

从发布的代码中,应该使prefs一个类成员变量具有全局作用域。

prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());不是getSharedPreferences因为您尚未创建该文件而执行该操作。

要创建文件,您需要使用PreferenceManager。要使用PreferenceManager,请使用Activity.getPreferenceManager()


@sugarynugs那正是我在做什么...事实上,我从另
一篇

@sugarynugs侦听器= new SharedPreferences.OnSharedPreferenceChangeListener(){public void onSharedPreferenceChanged(SharedPreferences prefs,String key){//实现}}); prefs.registerOnSharedPreferenceChangeListener(listener)
mixkat 2011年

1
@sugarynugs侦听器是此类的一个实例变量。只是为了避免它成为
gc。–

1
变量声明在哪里?是Global吗?加上错误的代码...监听器中的位。
techiServices,2011年

1
@RenniePet,不,您不必取消注册在Application类中注册的首选项监听器。例如,如果您没有在Activity类中注销侦听器,则垃圾收集器将在活动关闭后不释放Activity对象分配的内存(首选项管理器引用了侦听器,侦听器引用了活动)。但是Application类没有这种情况。
babay

67

在您的PreferenceActivity课程中,实现SharedPreferences.OnSharedPreferenceChangeListener接口。将所需的onSharedPreferenceChanged方法添加到您的类中,然后将其注册到中onCreate

在这里查看示例代码:

public class MyPreferences extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.fw_preferences); //deprecated
        PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        // handle the preference change here
    }

}

1
您将如何重构代码中已弃用的行? addPreferencesFromResource(R.xml.fw_preferences); //deprecated
mattecalcio 2015年

1
@mattecalcio我知道我来晚了,但是这是加载设置xml的新方法:stackoverflow.com/a/13441715/1318194

2
在MainActivity的onDestroy()中执行unregisterOnSharedPreferenceChangeListener(this)是一种好习惯吗?
Andrii Kovalchuk

1
您的回答很棒,但是文档也说:在履历表中添加注册部分,在暂停中为垃圾回收器添加注销部分。再次感谢 developer.android.com/guide/topics/ui/…–
mehmet

连同实现接口OnSharedPreferenceChangeListener以及在其上onResume注册和注销监听程序 onPause
MRodrigues
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.