这篇文章我会系统的提供底层Preference的使用CheckBox选择项CheckBoxPreference、EditText编辑对话框EditTextPreference、列表选择ListPreference、多项选择MultiSelectListPreference、 开关选择SwitchPreference的应用和管理。

一、Preference系树形结构图

首先还是再来回顾下Preference系的树形结构图,加深下他们之间的继承关系。

二、DialogPreference系

DialogPreference是一个抽象类直接继承自Preference,它的独特之处在于它是基于Dialog的,也就是说但我们点击对应的DialogPreference系时是以Dialog形式展现的。系统给我们提供了以下几个它的子类:EditTextPreference、ListPreference和MultiSelectListPreference。

1、DialogPreference系的共性

我们都知道DialogPreference是基于Dialog的,当我们点击的时候会以对话框的形式显示出来,所以除了继承自Preference的属性之外也还新增了很多自己独有的属性和方法。

1.1、DialogPreference系独有属性

1.2、DialogPreference独有的方法

这里只列出三个有用的回调方法,其他setter、gettter方法和其他方法由于篇幅问题就不列出了(下同)

2、DialogPreference系的应用与管理

1、EditTextPreference

<?xml version="1.0" encoding="utf-8"?>

2、ListPreference

ListPreference和其他Preference一样的机制,也是借助于SharedPreferences来实现存储和更新,特别之处在于SharedPreferences存储的是Android:entryValues的值(即android:entryValues与key一一对应形成键值对),而显示到界面的是android:entries则与android:entryValues一一对应。

2.1、ListPreference的特有属性

2.2、ListPreference的特有方法

2.3、ListPreference应用

列表数据源字符数组:

<?xml version="1.0" encoding="utf-8"?>    Dota    Dota2    NBA2K10    FIFA2K10    0    1    2    3

ListPreference的xml文件:

<?xml version="1.0" encoding="utf-8"?>

PreferenceActivity的实现:

public class ListPreferenceActivity extends PreferenceActivity implements Preference.OnPreferenceChangeListener{private ListPreference preference;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    addPreferencesFromResource(R.xml.list_preference);    init();}private void init(){    preference= (ListPreference) findPreference("key_listpreference");    ///preference.setOnPreferenceClickListener(this); ****点击事件已经被覆盖掉了****    preference.setOnPreferenceChangeListener(this);    // 设置summary为所选中的值列表值    if(preference.getEntry()!=null) {        preference.setSummary(preference.getEntry());//初始化时设置summary    }}@Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {    /*newValue 返回的值是getEntries的值    * 01-09 12:30:43.558 15872-15872/com.crazymo.prerencescreen D/TAG2: onPreferenceChange run1    * 01-09 12:41:10.627 15872-15872/com.crazymo.prerencescreen D/TAG2: onPreferenceChange run2    * */    if(preference instanceof ListPreference) {        ListPreference listPreference = (ListPreference) preference;//把preference这个Preference强制转化为ListPreference类型        CharSequence[] entries = listPreference.getEntries();//获取ListPreference中的实体内容        int index = listPreference.findIndexOfValue((String) newValue);//获取ListPreference中的实体内容的下标值        listPreference.setSummary(entries[index]);//listPreference中的sumamry显示为当前ListPreference的实体内容中选择的        Log.d("TAG2", "onPreferenceChange run"+newValue);        Toast.makeText(ListPreferenceActivity.this,entries[index].toString(),Toast.LENGTH_LONG).show();    }    return true;}

}

3、MultiSelectListPreference

MultiSelectListPreference和ListPreference都是列表形式的DialogPreference,不同的是ListPreference提供单选列表,而在Android3.0之后可以通过MultiSelectListPreference来实现多选,所以他们的属性和方法都几乎是相同的,当然也包括使用基本语法,但是要注意一点由于要支持多选,所以MultiSelectListPreference的SharedPreferences保存的是集合set(我们应该有这个概念集合就是用于保存多个对象的),所以读取数据的时候处理稍显麻烦。

3.1、MultiSelectListPreference新增的方法

3.2、MultiSelectListPreference应用

还是使用一样的数据源,一样的xml(把ListPreference改为MultiSelectListPreference其他不变

public class MutilListPreferenceActivity extends PreferenceActivity implements OnPreferenceChangeListener {private MultiSelectListPreference preference;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    addPreferencesFromResource(R.xml.list_preference);    preference= (MultiSelectListPreference) findPreference("key_listpreference");    preference.setOnPreferenceChangeListener(this);    initFromSharedPreferences();}private void initFromSharedPreferences(){    String summary=null;    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);    Setoptions = prefs.getStringSet("key_listpreference", null);  //因不设置初始值,所以要进行null的判断    if(options!=null) {        CharSequence[] extras = preference.getEntries();        for (String op : options) {            int index = preference.findIndexOfValue(op);            if (summary==null) {               summary="";            }            summary = summary + extras[index];            }        preference.setSummary(summary);    }}@Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {    if(preference instanceof MultiSelectListPreference) {        String summary=null;        MultiSelectListPreference multiSelectListPreference=(MultiSelectListPreference)preference;        CharSequence[] extras =  multiSelectListPreference.getEntries();        Set options=(Set)newValue;        for (String op : options){            int index = multiSelectListPreference.findIndexOfValue(op);            Log.d("TAG2", op + extras[index]);            if(summary==null) {                summary="";            }            summary = summary + extras[index];        }        Log.d("TAG2","onPreferenceChange:::"+summary);        multiSelectListPreference.setSummary(summary);    }    return true;}

}

三、TwoStatePreference系

TwoStatePreference也是一个抽象类,作用如字面意思。是基于两种可选状态的首选项基类,他没有新增独特的属性,全都是继承上级,在SharedPreferences里通过维护一个布尔值(checked时为true)来设置当前状态的启用和禁止的一种Preference。Android也为我们提供了两种:CheckBox选择项CheckBoxPreference和 开关选择SwitchPreference供我们直接使用。

1、TwoStatePreference的共性

**2、TwoStatePreference的应用与管理
1、CheckBoxPreference
1.1、CheckBoxPreference新增的属性**

1.2、CheckBoxPreference应用

res/xml/widget_layout.xml

<?xml version="1.0" encoding="utf-8"?><?xml version="1.0" encoding="utf-8"?>

每次点击的时候先执行onChange再执行onClick:

01-10 11:16:56.459 31292-31292/com.crazymo.prerencescreen D/TAG2: true
01-10 11:16:56.464 31292-31292/com.crazymo.prerencescreen D/TAG2: CheckBox Clicked!!
01-10 11:36:19.660 31292-31292/com.crazymo.prerencescreen D/TAG2: false
01-10 11:36:19.662 31292-31292/com.crazymo.prerencescreen D/TAG2: CheckBox Clicked!

2、SwitchPreference

2.1、SwitchPreference新增属性

2.2、SwitchPreference应用

每次点击的时候先执行onChange再执行onClick:

01-10 11:47:55.554 12915-12915/com.crazymo.prerencescreen D/TAG2: true
01-10 11:47:55.559 12915-12915/com.crazymo.prerencescreen D/TAG2: SwitchPrefeence

这三篇文章我们终于把Preference的应用和一些简单原理给弄清楚了,其实这并不需要我们去背语法或者api什么的,我们要从原理去理解,从他们的结构关系去理解,究其根本。Preference只不过是把自己的key作为SharedPreferences里的key保存数据,进而再次进入界面的时候由Activity去自动读取并刷新UI,不同的Preference保存的SharedPreferences格式不一样,比如说TwoStatePreference保存的是boolean的键值对,ListPreference则保存普通的字符串键值对;MultiSelectListPreference由于要保存多组数据则采取的是保存set集合等等,原理可以归结为两步:SharedPreferences的数据保存和PreferenceActivity读取SharedPrefences的数据并更新。

如有疑问,请关注我的公众号,我们再继续交流!

更多相关文章

  1. android之AlertDialog 点击其他区域自动消失
  2. FinalDB介绍
  3. Android(安卓)NDK r8e java.lang.UnsatisfiedLinkErro错误解决方
  4. 3.addView调用之后导致子布局的android:layout_width="match_par
  5. [置顶] Android(安卓) ExpandableListView
  6. 分析通话记录信息是通过什么写入的 android 源码 保存通话记录
  7. Android(安卓)ConstraintLayout布局详解
  8. android 移动图片
  9. Android(安卓)Studio 安装No JVM Installation found. Please in

随机推荐

  1. android视频录制(调用系统视频录制),生成
  2. android之activity生命周期示例
  3. android 年月日选择器(可选择年,年月,年月日
  4. android WebView onJsAlert onJsConfirm
  5. Android(安卓)SQLiteOpenHelper的使用
  6. Android(安卓)webView中调用JavaScript
  7. android中的Handler
  8. android画日历
  9. Android获取GPS坐标:
  10. 高德地图Android,绘制自定义定位蓝点、mar