【问题标题】:What's different between OnPreferenceChangeListener and OnSharedPreferenceChangeListenerOnPreferenceChangeListener 和 OnSharedPreferenceChangeListener 有什么不同
【发布时间】:2012-10-30 13:45:57
【问题描述】:

我想获得复选框首选项的值。哪种方式适合听偏好?

OnPreferenceChangeListener 和 OnSharedPreferenceChangeListener 之间的真正区别是什么?!

更新 为什么没有调用 onSharedPreferenceChanged?

public class Setting extends PreferenceActivity implements
        OnSharedPreferenceChangeListener // ,OnPreferenceChangeListener
{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);// deprecated warning
    }

    @Override
    public void onSharedPreferenceChanged(
            SharedPreferences sharedPreferences, String key) {// DO Stuff
    }

    @Override
    protected void onResume() {
        super.onResume();
        // getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
        // PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);
        this.getSharedPreferences("myPrefDB", MODE_PRIVATE)
                .registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        // getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
        // PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(this);
        this.getSharedPreferences("myPrefDB", MODE_PRIVATE)
                .unregisterOnSharedPreferenceChangeListener(this);
    }
}

【问题讨论】:

    标签: android sharedpreferences android-preferences


    【解决方案1】:

    这两者之间的区别在于OnPreferenceChangeListener 是一个回调调用只有当其 偏好改变(适用于单个键),而OnSharedPreferenceChange 是一个回调调用每当any SharedPreferences 对象中的首选项更改(适用于所有键)。

    因此,在您的情况下,您需要将OnPreferenceChangeListener 与您的CheckBoxPreference 一起使用。

    这是一个例子:

    Preference ckboxPref = this.findPreference(CKBOX_PREF_KEY);
    ckboxPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
    
        @Override
        public boolean onPreferenceChange(Preference preference,
                Object newValue) {
            //Do stuff
        }
    });
    

    如果你使用片段,findPreference 方法不起作用,但你没有使用任何片段,所以没关系。

    【讨论】:

    • 为什么它不起作用? : @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {if (key.equalsIgnoreCase("myKey") ...
    • 什么不起作用?当您更改该首选项时不会调用它?
    • 您是否在包含此键的SharedPreferences 对象上调用它?请在您的问题中添加代码。
    • 它没有调用,因为(可能)“myPrefDB”不是您的 PreferenceActivity 使用的名称。
    • 不,我认为您不需要在活动暂停时取消注册。毕竟,当activity暂停时,偏好不会改变,因为它只是在这个activity中改变......
    猜你喜欢
    • 2011-05-22
    • 2015-11-04
    • 2019-10-22
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多