OnPreferenceChangeListener,OnPreferenceClickListener

在PreferenceActivity中,Preference控件的值变动会自动保存到SharedPreferences。本文介绍了OnPreferenceChangeListener用于手动处理值改变,阻止自动保存,并提供示例代码。OnPreferenceClickListener则在控件点击时触发,先保存值再执行特定操作。当同时使用这二者,onPreferenceChange()先执行,接着是onPreferenceClick(),若返回true,则不调用onPreferenceTreeClick,反之则调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当一个Activity继承PreferenceActivity后,其中的Preference控件的值会自动的保存到SharedPreferences中,得到这个SharedPreferences的方法:PreferenceManager.getDefaultSharedPreferences(this); 其中获取Preference控件值得key就是控件本身的key。

OnPreferenceChangeListener

作用是当控件的值改变时,阻止SharedPreferences自动改变其值,需要你手动的去响应事件,保存值。

布局test.xml:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <CheckBoxPreference
        android:key="checkbox1"
        android:title="CheckBox" />

    <Preference
        android:key="preference1"
        android:summary="请点击"
        android:title="Preference" />

</PreferenceScreen>

MainActivity:

public class MainActivity extends PreferenceActivity implements
        OnPreferenceChangeListener {

    private CheckBoxPreference mCheckBoxPreference;
    private SharedPreferences sp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.test);
        sp = PreferenceManager.getDefaultSharedPreferences(this);
        mCheckBoxPreference = (CheckBoxPreference) findPreference("checkbox1");
        mCheckBoxPreference.setOnPreferenceChangeListener(this);
    }

    @Override
    protected void onResume() {
        // 在onPreferenceChange中设置Summary,如果横屏或者退出,Summary的值会发生异常,在onResume()里再判断一次就好了
        super.onResume();
        if (mCheckBoxPreference.isChecked()) {
            mCheckBoxPreference.setSummary("true");
        } else {
            mCheckBoxPreference.setSummary("false");
        }
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        if (mCheckBoxPreference == preference) {
            String value = newValue.toString();
            Toast.makeText(this, value, Toast.LENGTH_SHORT).show();
            //第一次安装应用时,是没有SharedPreferences的,所以第二个参数要跟默认值一样
            boolean bool = sp.getBoolean("checkbox1", false);
            //因为SharedPreferences中值不会改变,所以,要改成相反的值
            if (bool) {
                SharedPreferences.Editor editor = sp.edit();
                editor.putBoolean("checkbox1", false);
                editor.commit();
                mCheckBoxPreference.setChecked(false);
                mCheckBoxPreference.setSummary(value);
            } else {
                SharedPreferences.Editor editor = sp.edit();
                editor.putBoolean("checkbox1", true);
                editor.commit();
                mCheckBoxPreference.setChecked(true);
                mCheckBoxPreference.setSummary(value);
            }
            return true;//表示新值已成功写入SharedPreferences
        }
        return false;
    }

}

界面变化:

这里写图片描述

这里写图片描述

OnPreferenceClickListener

当控件被点击时,先将相应的值写入SharedPreferences,然后触发相应操作

//省略部分代码
    private CheckBoxPreference mCheckBoxPreference2;
    mCheckBoxPreference2 = (CheckBoxPreference) findPreference("checkbox2");
    mCheckBoxPreference2.setOnPreferenceClickListener(this);
    protected void onResume(){}//进行summary设置
    public boolean onPreferenceClick(Preference preference) {

        if (mCheckBoxPreference2 == preference) {
            //根据点击后的状态判断
            if (mCheckBoxPreference2.isChecked()) {
            //点击后如果为true,得到的bool为true
                boolean bool = sp.getBoolean("checkbox2", false);
                mCheckBoxPreference2.setSummary(bool + "");
            } else {
                boolean bool = sp.getBoolean("checkbox2", false);
                mCheckBoxPreference2.setSummary(bool + "");
            }
            return true;//完成触发操作
        }
        return false;
    }

还有一个响应OnPreferenceClickListener的方法为onPreferenceTreeClick,

    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,Preference preference) 

如果返回true,代表已成功执行点击事件,返回false,代表执行默认动作并且返回上层调用链。

注:如果同时调用了上面三种方法,会先调用onPreferenceChange()方法,并且onPreferenceChange()方法独立于其他两种方法,因为我们要先确认是否保存值。然后调用onPreferenceClick()方法,如果该方法返回true,则不再调用onPreferenceTreeClick方法 ;返回false,则继续调用onPreferenceTreeClick方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值