如何检测首选项中是不是进行了更改?

Posted

技术标签:

【中文标题】如何检测首选项中是不是进行了更改?【英文标题】:How to detect if changes were made in the preferences?如何检测首选项中是否进行了更改? 【发布时间】:2011-06-27 05:48:54 【问题描述】:

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

这有帮助...

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

其他相关帖子: SharedPreferences.onSharedPreferenceChangeListener not being called consistently


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

【问题讨论】:

我看到了太多的方向,这可能取决于您的总体目标。您能否详细说明您检查的时间和目的是什么? @RHughes 我只希望每次进行更改以做某事...刚刚找到此链接***.com/questions/2542938/…... 仍然无法使其正常工作...侦听器中的方法永远不会被调用...有什么想法吗??? 不看代码,我只能猜测你犯了我似乎总是犯的同样错误。我建立了一个伟大的听众,然后忘记将它附加到正确的对象上。此外,请确保您在 onCreate() 方法中或至少在您实际需要侦听器进行侦听之前运行的代码中将侦听器附加到对象。 @RHughes 不,我将侦听器附加到对象...不知道它有什么问题...它肯定在创建...无论如何感谢您的回复... 【参考方案1】:

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

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

我就是这样做的,我从来没有遇到过问题。

否则,有问题的是您在侦听器中进行的条件检查。贴出代码。

编辑:

根据您发布的代码,您应该将prefs 设为类成员变量,使其具有全局范围。

并使用prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 而不是getSharedPreferences,因为您尚未创建该文件。

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

【讨论】:

@sugarynugs 这正是我正在做的......事实上我从其他帖子中复制了代码...... @sugarynugs listener = new SharedPreferences.OnSharedPreferenceChangeListener() public void onSharedPreferenceChanged(SharedPreferences prefs, String key) // 实现 ); prefs.registerOnSharedPreferenceChangeListener(listener) @sugarynugs listener 是这个类的一个实例变量..只是为了避免它被 gc.. 变量声明在哪里?是Global 吗?加上错误的代码发布......侦听器内部的位。 @RenniePet,不,您不必取消注册在 Application 类中注册的首选项侦听器。例如,如果你没有在Activity类中注销一个监听器,那么垃圾收集器在activity关闭后不会释放Activity对象分配的内存(preference manager有一个listener的reference,listener有activity的reference)。但是您的应用程序类没有这种情况。【参考方案2】:

在您的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
    


【讨论】:

您将如何重构代码中已弃用的行? addPreferencesFromResource(R.xml.fw_preferences); //deprecated @mattecalcio 我知道我迟到了,但这是加载设置 xml 的新方法:***.com/a/13441715/1318194 在 MainActivity 的 onDestroy() 中做 unregisterOnSharedPreferenceChangeListener(this) 是个好习惯吗? 您的答案很棒,但文档也说:在简历中添加注册部分并在垃圾收集器的暂停中添加取消注册部分。再次感谢developer.android.com/guide/topics/ui/… 连同实现接口OnSharedPreferenceChangeListener并在onResume上注册监听器并在onPause上注销

以上是关于如何检测首选项中是不是进行了更改?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中更改客户端 TLS 首选项?

当用户更改首选项时如何在运行时禁用 Crashlytics/Fabric

MCD 机电一体化概念设计首选项

Android - 如何在代码中设置首选项

(23)Powershell中的首选项变量

在 Web 应用程序中存储小型 UI 用户首选项的最佳方式? [关闭]