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或者自身,

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

  • 相关阅读:
    java.lang.NoSuchMethodError:antlr.collections.AST.getLine() I
    T7 java Web day01 标签HTML
    T6 s1 day19
    T5 s5 Day18
    T5 s4 Day 17
    T5 s3 day16
    T5 s2 Day 15
    T5 s1 day14
    T4 S03 day 12
    T4 S01 day1
  • 原文地址:https://www.cnblogs.com/myparamita/p/2172773.html
Copyright © 2011-2022 走看看