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

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

这篇文章我会系统的提供底层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"?>
<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>
            
             
             
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8
            • 9
            • 10
            • 11
            • 12
            • 13
            • 14
            • 15
            • 16
            • 17
            • 18
            • 19
            • 20
            • 21
            • 22
            • 23
            • 24
            • 25
            • 26
            • 27
            • 28
            • 29
            • 30
            • 31
            • 32

            每次点击的时候先执行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的数据并更新。

            • 5
              点赞
            • 9
              收藏
              觉得还不错? 一键收藏
            • 1
              评论
            Android应用开发详解》 作者:郭宏志 编著 内容简介    本书分为个部分,包括基础篇、技术篇和应用篇。由浅入深地讲述了Android应用开发的方方面面。    第一篇 基础篇 第1章 Android概述 Android概述,讲述了Android的前生后世、架构和特点、Android Market、应用程序组件和Android与Java ME的区别及联    第2章 Android开发基础 Android开发基础,讲述了Android开发环境的搭建、Android常用工具的使用和第一个Android应用程序的开发    第二篇 技术篇 第3章 Android中的资源访问 Android 中的资源访问,讲述了如何定义和访问Android中的外部资源。   第4章 Android用户界面 Android 用户界面,讲述了Android中的事件处理机制、布局管理和常用组件的使用。    第5章 Android基本程序单元Activity Android 基本程序单元Activity,讲述了Android中重要组件Activity的创建、启动和生命周期等内容    第6章 Android组件之间的信使Intent Android 组件之间的信使Intent,讲述了Intent对象及其属性、Intent的实现策略和Intent的常见应用   第7章 Android Service组件 Android Service组件,讲述了Android中的后台服务Service的概念、创建和使用,并详细讲解了远程服务的调用    第8章 Android广播事件处理 Broadcast Receiver Android 广播事件处理 Broadcast Receiver,讲述了广播事件处理机制、Notification、NotificationManager和AlarmManager的使用    第9章 Android中的数据存取 Android中的数据存取,讲述了Android的四种数据存取方法:Preference、File、SQLite和Network    第10章 Content Provider Content Provider,讲述了Android不同应用程序之间相互共享数据的机制,包括ContentProvider和ContentResolver    第11章 Android中的多媒体应用 Android中的多媒体应用,讲述了Android的图片应用、音频及视频播放、音频及视频录制和照相机的使用    第12章 Android中的图形图像 Android中的图形图像,讲述了Android中的图片、动画、图形绘制和图形特效    第13章 Android中的互联网应用 Android中的互联网应用,讲述了Android中的各种网络应用,包括Socket、URL、HTTP、Web Service和WebView组件    第14章 Android中的GPS应用 Android中的GPS应用,讲述了LocationManager、LocationProvider、跟踪、定位、Geocoder正逆向编解码和可视化位置服务    第应用篇 第15章 Android应用案例——移动警务通 Android 应用案例——移动警务通,通过一个真实的商业案例讲解了Android的各种应用,本项目包括信息采集、信息查询、照片上传、GPS定位等综合警务应用    第16章 Android应用案例——雷电游戏 Android 应用案例——雷电游戏,通过一个完整的雷电游戏,讲述了Android的游戏开发思路、框架和具体实现,并比较了Android游戏开发和Java ME游戏开发的异同,成功移植了Java ME游戏API到Android当中    第17章 Android应用案例——备忘录 Android 应用案例——备忘录,通过一个Android基础应用项目综合应用Android中的各种组件,包括Activity、Service、Broadcast Receiver、ContentProvider、Intent和View的应用    第18章 Android应用案例——无线点餐Android 应用案例——无线点餐统,通过一个真实的商业案例讲解了Android的各种应用,本项目包括操作员登录、点餐、结算、转台、并台、查台、更新数据和退出统等餐厅点餐的常用操作
            您好,我不太了解Android偏好设置,但是我可以尝试帮助您找到正确的答案。 很高兴为您服务!我可以为您提供有关Android偏好设置的信息。Android Preference(安卓偏好设置)是一种用于管理应用程序设置的框架。它允许您在应用程序中创建一列用户可见的设置,这些设置可以是键值对、列表、单选按钮等。 在Android应用程序中使用Preference框架可以使用户轻松地更改应用程序的设置,而无需了解复杂的代码或设置文件。您可以使用xml文件来定义偏好设置屏幕,也可以通过编程方式动态创建偏好设置屏幕。 在使用Preference框架时,您需要了解以下概念: 1. Preference:偏好设置的基本单元,它可以是一个复选框、单选框、列表等。 2. PreferenceScreen:偏好设置的屏幕,它是一个容器,可以包含多个Preference。 3. PreferenceCategory:Preference的分类,用于组织PreferenceScreen。 4. SharedPreferences:用于存储应用程序设置的接口,偏好设置框架会将用户更改的设置保存到SharedPreferences中。 以下是一个示例xml文件,用于定义一个简单的偏好设置屏幕: ``` <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="Display settings"> <CheckBoxPreference android:key="notifications" android:title="Notifications" android:summary="Enable/disable notifications" android:defaultValue="true" /> <ListPreference android:key="language" android:title="Language" android:summary="Select your preferred language" android:entries="@array/language_entries" android:entryValues="@array/language_values" android:defaultValue="en" /> </PreferenceCategory> </PreferenceScreen> ``` 该xml文件定义了一个PreferenceScreen,包含一个PreferenceCategory和两个Preference。其中,一个是CheckBoxPreference,用于启用或禁用通知;另一个是ListPreference,用于选择语言。 要在应用程序中使用该偏好设置屏幕,您需要使用PreferenceFragment或PreferenceActivity。PreferenceFragment是一个Fragment,可以显示偏好设置屏幕,而PreferenceActivity是一个Activity,用于显示偏好设置屏幕。 以下是一个示例PreferenceFragment代码,用于显示上面定义的偏好设置屏幕: ``` public class MyPreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); } } ``` 您需要在Activity中使用FragmentManager来添加PreferenceFragment: ``` public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit(); } } ``` 这就是Android Preference框架的基本用法。

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

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

            请填写红包祝福语或标题

            红包个数最小为10个

            红包金额最低5元

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

            抵扣说明:

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

            余额充值