Android—Preference详解之Preference系的基本应用(三)
2017-04-16 13:52
260 查看
这篇文章我会系统的提供底层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
2、ListPreference
ListPreference和其他Preference一样的机制,也是借助于SharedPreferences来实现存储和更新,特别之处在于SharedPreferences存储的是Android:entryValues的值(即android:entryValues与key一一对应形成键值对),而显示到界面的是android:entries则与android:entryValues一一对应。
2.1、ListPreference的特有属性
2.2、ListPreference的特有方法
2.3、ListPreference应用
列表数据源字符数组:
ListPreference的xml文件:
PreferenceActivity的实现:
}
3、MultiSelectListPreference
MultiSelectListPreference和ListPreference都是列表形式的DialogPreference,不同的是ListPreference提供单选列表,而在Android3.0之后可以通过MultiSelectListPreference来实现多选,所以他们的属性和方法都几乎是相同的,当然也包括使用基本语法,但是要注意一点由于要支持多选,所以MultiSelectListPreference的SharedPreferences保存的是集合set(我们应该有这个概念集合就是用于保存多个对象的),所以读取数据的时候处理稍显麻烦。
3.1、MultiSelectListPreference新增的方法
3.2、MultiSelectListPreference应用
还是使用一样的数据源,一样的xml(把ListPreference改为MultiSelectListPreference其他不变
}
三、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
每次点击的时候先执行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的数据并更新。
如有疑问,请关注我的公众号,我们再继续交流!
一、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"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:key="using_categories_in_root_screen" android:summary="Using Preference Categories" android:title="Categories"> <EditTextPreference android:key="key_prerence" android:title="Preferece Title" android:summary="Preference Summary" /> </PreferenceScreen>
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"?> <resources> <string-array name="game"> <item>Dota</item> <item>Dota2</item> <item>NBA2K10</item> <item>FIFA2K10</item> </string-array> <string-array name="game_index"> <item>0</item> <item>1</item> <item>2</item> <item>3</item> </string-array> </resources>
ListPreference的xml文件:
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <ListPreference android:icon="@mipmap/ic_launcher" android:title="ListPreference" android:summary="ListPreference summary" android:dialogIcon="@mipmap/ic_blue_launcher" android:dialogTitle="Favourite Games" android:key="key_listpreference" android:entries="@array/game" android:entryValues="@array/game_index" /> </PreferenceScreen>
PreferenceActivity的实现:
public class ListPreferenceActivity extends PreferenceActivity implements Preference.OnPreferenceChangeListener{ private ListPreference preference; @Override protected 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 } } @Override public 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; @Override protected 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); Set<String>options = 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); } } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { if(preference instanceof MultiSelectListPreference) { String summary=null; MultiSelectListPreference multiSelectListPreference=(MultiSelectListPreference)preference; CharSequence[] extras = multiSelectListPreference.getEntries(); Set<String> options=(Set<String>)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"?> <CheckBox xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:button="@mipmap/ic_bt_config" android:clickable="false" android:focusable="false" /> <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <CheckBoxPreference android:icon="@mipmap/ic_launcher" android:key="key_checkboxprefs" android:title="CheckBoxPreference" android:summary="CheckBoxPreference summary" android:summaryOff="Summary off" android:summaryOn="On Summary" android:order="10" /> <CheckBoxPreference android:icon="@mipmap/ic_blue_launcher" android:key="key_checkboxprefs2" android:title="CheckBoxPreference2" android:summary="CheckBoxPreference2 summary" android:summaryOff=" Off Summary2" android:summaryOn="On Summary2" android:order="1" android:widgetLayout="@xml/widget_layout" /> </PreferenceScreen>
每次点击的时候先执行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的数据并更新。
如有疑问,请关注我的公众号,我们再继续交流!
相关文章推荐
- Android进阶——Preference详解之Preference系的基本应用(三)
- Android进阶——Preference详解之Preference系的基本应用(三)
- Android进阶——Preference详解之Preference系的基本应用和管理(二)
- Android——Preference详解之Preference系的基本应用和管理(二)
- Android进阶——Preference详解之Preference系的基本应用和管理(二)
- 详解Android应用中DialogFragment的基本用法
- 详解Android应用中使用TabHost组件进行布局的基本方法
- Android 中 Webview基本应用详解
- VC++ Datagrid应用实例详解系列(1) - 基本功能
- Android 应用开发详解 热销中
- Android网络开发详解具体应用代码
- Android Google Map应用开发详解
- Android 对话框基本应用详细教程
- eclipse+ADT 进行android应用签名打包详解
- 【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!
- 详解Android首选项框架ListPreference
- android应用开发之intent详解
- Android的jni的调用C,C++的几个应用(基本类型,数组,类(结构体))
- Android SurfaceView 的基本应用
- Android之PreferenceActivity 详解