zoukankan      html  css  js  c++  java
  • Android Preference使用

    0介绍

      Android系统内的设置界面由Android Preference相关类提供使用preference这个键值对的方式来自动保存这些数据,并即时生效,同时Android提供一种类似layout的方式来进行Preference的布局。其中,使用PreferenceScreenPreferenceCategory对布局进行控制,设置子项包含以下种类: LListPreferenceCheckBoxPreferenceEditTextPreferenceRingtonePreferenceEditPhoneNumberPreference等。设置数据的保存和读取通过全局保存对象SharedPreferences

    实现,保存时触发相应事件通过Preference.onPreferenceChangeListener

    实现。下面分别介绍各类。

    1 配置文件示例

    配置功能xml示例
    <?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <CheckBoxPreference android:key="music"
    android:title
    ="@string/music_title" android:summary="@string/music_summary"
    android:defaultValue
    ="true" />
    <CheckBoxPreference android:key="hints"
    android:title
    ="@string/hints_title" android:summary="@string/hints_summary"
    android:defaultValue
    ="true" />
    <PreferenceScreen android:key="detailSetting"
    android:title
    ="@string/detail_setting_title"
    android:summary
    ="@string/detail_setting_summary">
    <CheckBoxPreference android:key="music1"
    android:title
    ="@string/music_title"
    android:summary
    ="@string/music_summary"
    android:defaultValue
    ="true" />
    <CheckBoxPreference android:key="music2"
    android:title
    ="@string/music_title"
    android:summary
    ="@string/music_summary"
    android:defaultValue
    ="true" />
    </PreferenceScreen>
    <PreferenceScreen android:key="customSetting"
    android:title
    ="@string/custom_setting_title" android:summary="@string/custom_setting_summary">
    <intent android:action="android.intent.action.MAIN"
    android:targetPackage
    ="com.rasa.game" android:targetClass="com.rasa.game.CustomSetting" />
    </PreferenceScreen>
    <com.rasa.game.CustomPreference
    android:key="my_preference"
    android:title
    ="Advance Preference"
    android:summary
    ="You can custom design your prefrence UI"
    android:defaultValue
    ="100" />
    </PreferenceScreen>

      

    2 设置页面布局

    2.1 PreferenceScreen

    每一个设置界面就是一个PreferenceScreen,因此其xml配置文件到根节点是 PreferenceScreen,其内可包含 PreferenceScreenPreferenceCategory,其他设置项如 ListPreferenceCheckBoxPreference等。 此项包含的所有子项在新屏幕上显示,就好像进入二级菜单。

    处于内层的PreferenceScreen被点击时,在新页面中显示其内的两个CheckBoxPreference选项

    view code
    <PreferenceScreen android:key="detailSetting"
    android:title
    ="@string/detail_setting_title" android:summary="@string/detail_setting_summary">
    <CheckBoxPreference android:key="music1"
    android:title
    ="@string/music_title" android:summary="@string/music_summary"
    android:defaultValue
    ="true" />
    <CheckBoxPreference android:key="music2"
    android:title
    ="@string/music_title" android:summary="@string/music_summary"
    android:defaultValue
    ="true" />
    </PreferenceScreen>

    也可以设置内层PreferenceScreenIntent属性,设置点击PreferenceScreen时跳转到com.android.phone.SelectSimCard页面。如:

    View Code
    <PreferenceScreen android:key="config_sub"
    android:title
    ="@string/sel_sub_title" android:summary="@string/sel_sub_summary"
    android:persistent
    ="false">
    <intent android:action="android.intent.action.MAIN"
    android:targetPackage
    ="com.android.phone" android:targetClass="com.android.phone.SelectSimCard" />
    </PreferenceScreen>

      

    2.2 PreferenceCategory

    PreferenceCategory 为设置选项类别,其内部包含一个或多个设置选项。如 PreferenceScreen, 其他设置项如 ListPreferenceCheckBoxPreference等。

    PreferenceCategory在设置界面上显示为一个类别标题。 PreferenceCategory是一个逻辑上的类别概念。

    3 常用设置项

    ListPreference 带下拉的设置项

    CheckBoxPreference CheckBox的设置项

    EditTextPreference 输入文本到设置项

    RingtonePreference 铃声设置项

    EditPhoneNumberPreference 号码设置项

    …...

    3.1 设置项属性

    Key为这个PreferenceID,设置了才可以在代码中引用

    Title是显示的标题

    Summary是显示在标题下的文字介绍

    Dependency:可用来配置此设置项是否依赖于其他配置项,如:填写一个CheckBoxPreferenceKey,这样就会在填写的那个CheckBoxPreference勾选时当前这个Preference才可用

    Default Value为初始值


    自定义设置项

    默认提供的设置项不能满足全部要求,因此,会根据需要对设置项进行自定义。

    1)首先扩展Preference类,注意使用SharedPreferences对配置项进行保存。

    2)定义此Preference类对应的layout

    3)直接用标签引用此Preference。如:

    View Code
        <com.rasa.game.CustomPreference
    android:key="my_preference" android:title="Advance Preference"
    android:summary
    ="You can custom design your prefrence UI"
    android:defaultValue
    ="100" />

      

    5 设置变化事件

    6 设置的读取和保存

    1.全局保存对象SharedPreferences

    android中,最简单的持久化数据的办法是使用Preferences API,获取preference对象有三种方式,都是通过Activity对象的方法,获取的是android.content.SharedPreferences对象实例。

    getPreferences():获取到作用域是本Activitypreference

    getSharedPreferences():获取到作用域是本应用程序的preference

    getDefaultSharedPreferences():获取到全局作用域的preference

    保存方式如下:

    View Code
            String STORE_NAME = "Settings";
    SharedPreferences settings = getSharedPreferences(STORE_NAME, MODE_PRIVATE);
    SharedPreferences.Editor editor = settings.edit();
    editor.putInt("sourceType", 0);
    editor.commit();

      SharedPreferences实例是通过:

    get方法获取对应键的值;

    edit方法获取SharedPreferences.Editor对象

    通过SharedPreferences.Editorput方法写入键值对

    保存需要commit方法

    2.是否保存

    Preference.setOnPreferenceChangeListener

    通过在子类中调用此方法来设置监听,在变化后进行保存。

    ListPreference继承于DialogPreference,对onDialogClosed函数进行了覆盖,代码如下:

    View Code
        @Override
    protected void onDialogClosed(boolean positiveResult) {
    super.onDialogClosed(positiveResult);
    if (positiveResult) {// 是否是ok按钮点击?----------------------------------------(A)
    String value = mEditText.getText().toString();// 获取EditText控件的内容
    if (callChangeListener(value)) {// 应用层是否关注此值变化---------------------(C)
    setText(value);// 设置新的值--------------------------------------------------(D)
    }
    }
    }

      

    从以上可以看到,如果应用层允许保存用户设置的新值,则进行保存

    其中(D)最终调用Preference类的setPersistentString()函数进行保存。

    此函数可以从Preference.java的源码callChangeListener看到,看应用程序是否设置了

    setOnPreferenceChangeListener,这个一般是继承的PerferenceActivity的类来调用一个listener或者自身,

    如果没有没有设置 ,用户即忽略参数变化。

  • 相关阅读:
    数据分析 --- 01. Numpy
    爬虫 --- 08. 全站爬取(CrawlSpider), 分布式, 增量式爬虫
    爬虫 --- 07. 全站爬取(手动), post请求,cookie, 传参,中间件,selenium
    数据结构 --- 02. 内存, 顺序表, 单链表
    数据结构 --- 01. 时间复杂度,timeit模块,栈,队列,双端队列
    爬虫 --- 06. scrapy框架初始,移动端数据爬取
    爬虫 --- 05. 异步协程, 浏览器自动化,
    爬虫 --- 04. 代理服务器, 验证码识别, 处理cookie,线程池
    爬虫 --- 02. 爬取图片,数据解析
    一个关于const 变量作为map键值的Bug
  • 原文地址:https://www.cnblogs.com/myparamita/p/2172773.html
Copyright © 2011-2022 走看看