`

Android Preference使用

 
阅读更多

0介绍

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

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

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

1 配置文件示例

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:settings="http://schemas.android.com/apk/res/com.android.settings">

<PreferenceCategory android:key="dual_settings">

<ListPreference

android:key="data"

android:title="@string/data_title"

android:persistent="false"

android:entries="@array/dualsim_entries"

android:entryValues="@array/dualsim_values" />

<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>

</PreferenceCategory>

</PreferenceScreen>

 

2 设置页面布局

2.1 PreferenceScreen

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

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

<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页面。

如:

<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为初始值

3.2定义设置项

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

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

2)定义此Preference类对应的layout

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

<com.rasa.game.CustomPreference

android:key="my_preference"

android:title="Advance Preference"

android:summary="You can custom design your prefrence UI"

android:defaultValue="100" />

4 设置变化事件

5 设置的读取和保存

 

1.全局保存对象SharedPreferences

 

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

 

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

 

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

 

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

 

保存方式如下:

 

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函数进行了覆盖,代码如下:

 

@Override

 

protected void onDialogClosed(boolean positiveResult) {

 

super.onDialogClosed(positiveResult);

 

 

 

if (positiveResult) {//是否是ok按钮点击?----------------------------------------A

 

String value = mEditText.getText().toString();//获取EditText控件的内容 -----B

 

if (callChangeListener(value)) {//应用层是否关注此值变化---------------------C

 

setText(value);//设置新的值--------------------------------------------------D

 

}

 

}

 

}

 

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

 

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

 

 

 

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

 

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

 

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics