Android进阶——Preference详解之Preference系的基本应用(三)



引言

前面一篇文章Android进阶——Preference详解之Preference系的基本应用和管理(二)介绍了二级Preference的使用和特点,接下来进入系统给我提供的底级Preference的使用CheckBox选择项CheckBoxPreference、EditText编辑对话框EditTextPreference、列表选择ListPreference、多项选择MultiSelectListPreference、 开关选择SwitchPreference的应用和管理。以期大家能在学习的时候不仅仅只是会用,更应该知其然而知其所以然。

一、Preference系树形结构图

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

二、DialogPreference系

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

1、DialogPreference系的共性

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

1.1、DialogPreference系独有属性

DialogPreference系独有属性说明
android:dialogIcon对话框的icon
android:dialogLayoutdialog 的contentView 布局
android:dialogMessage对话框的内容
android:dialogTitle对话框的标题
android:negativeButtonText对话框里的按钮1名称
android:positiveButtonText对话框里的按钮2名称

1.2、DialogPreference独有的方法

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

方法说明
void onActivityDestroy()与Activity的onDestory类似,其实就是PreferenceManager.OnActivityDestroyListener的回调方法
void onClick(DialogInterface dialog, int which)当对话框里的按钮被点击时,可以通过which来判断点击的按钮,其实就是DialogInterface.OnClickListener的回调方法
void onDismiss(DialogInterface dialog)当对话框消失后执行,其实就是DialogInterface.OnDismissListener的回调方法

2、DialogPreference系的应用与管理

1、EditTextPreference

EditTextPreference新增方法说明
EditText getEditText()获取显示在Dialog上的EditText
String getText()获取对应SharedPreferences保存的值
<?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的特有属性
    ListPreference新增属性说明
    android:entries列表的显示项数据源
    android:entryValues列表实际保存至内部的值
    android:defaultValue这个属性不是特有的,但是有一点需要注意:这里设置的是android:entryValues里的值
    android:dialogMessage如果设置了这个属性,那么列表怎么会被覆盖掉
    2.2、ListPreference的特有方法
    ListPreference新增方法说明
    int findIndexOfValue(String value)返回获取ListPreference中的实体内容的下标值
    CharSequence[] getEntries()返回当前Preference设置的entries集合(xml配置的字符串数据源)
    CharSequence getEntry()返回当前选中的entries值
    CharSequence[] getEntryValues()返回当前的entries对应的value集合(xml配置的字符串数据源)
    CharSequence getSummary()获取当前summary
    String getValue()获取key值
    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新增的方法
          MultiSelectListPreference新增方法说明
          int findIndexOfValue(String value)返回获取ListPreference中的实体内容的下标值
          CharSequence[] getEntries()返回当前Preference 设置的entries集合(xml配置的字符串数据源)
          CharSequence[] getEntryValues()返回当前的entries对应的value集合(xml配置的字符串数据源)
          Set getValues()返回当前选中的values,SharedPreference的
          void setEntries(int entriesResId)
          void setEntries(CharSequence[] entries)
          void setEntryValues(CharSequence[] entryValues)
          void setEntryValues(int entryValuesResId)
          void setValues(Set values)
          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;
              }
          }
          /**Log
          *01-10 10:31:57.233 6089-6089/com.crazymo.prerencescreen D/TAG2: 1Dota2
          01-10 10:31:57.234 6089-6089/com.crazymo.prerencescreen D/TAG2: 2NBA2K10
          01-10 10:31:57.234 6089-6089/com.crazymo.prerencescreen D/TAG2: onPreferenceChange:::Dota2NBA2K10
          */
           
           

            这里写图片描述

            三、TwoStatePreference系

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

            1、TwoStatePreference的共性

            TwoStatePreference系独有方法说明
            CharSequence getSummaryOff()获取unchecked状态下summary的值
            CharSequence getSummaryOn()获取checked状态下summary的值
            boolean isChecked()获取是否checked
            void setChecked(boolean checked)设置checked状态
            void setSummaryOff设置unchecked下summary的值,可以通过字符串id和字符串
            void setSummaryOn设置checked下summary的值,可以通过字符串id和字符串

            2、TwoStatePreference的应用与管理

            1、CheckBoxPreference

            1.1、CheckBoxPreference新增的属性
            CheckBoxPreference新增属性说明
            android:summaryOffuncheck时的summary
            android:summaryOncheck时的summary
            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新增属性
                  CheckBoxPreference新增属性说明
                  android:summaryOffuncheck时的summary
                  android:summaryOncheck时的summary
                  android:switchTextOff
                  android:switchTextOn
                  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 Clicked
                   
                   

                    这里写图片描述

                    小结

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

                    转自http://blog.csdn.net/crazymo_/article/details/51842410

                    • 0
                      点赞
                    • 0
                      收藏
                      觉得还不错? 一键收藏
                    • 0
                      评论

                    “相关推荐”对你有帮助么?

                    • 非常没帮助
                    • 没帮助
                    • 一般
                    • 有帮助
                    • 非常有帮助
                    提交
                    评论
                    添加红包

                    请填写红包祝福语或标题

                    红包个数最小为10个

                    红包金额最低5元

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

                    抵扣说明:

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

                    余额充值