Android Preference的学习

一些配置数据,一些我们上次点击选择的内容,我们希望在下次应用调起的时候依然有效,无须用户再一次进行配置或选择,

这时候就可以使用Android提供的preference这个键值对的方式来处理这种情况,自动保存这些数据,并立时生效,

同时Android提供一种类似的layout的方式来进行Prefernce的布局。

下面来看一下Preference的各子控件;

单一控件:

CheckBoxPreference 参数勾选框。常用于使能开关

EditTextPreference  可编辑参数内容的文本框

ListPreference 以列表来呈现参数内容并提供选择参数操作的对话框。

RingtonePreference —— 铃声


组合控件:

PreferenceCategory :参数域,可以将一系列的参数归到同一个范围内,表示同类或近似功能的参数。类似于LinearLayou、RelativeLayout,用于组合一组Preference,使布局更具备层次感 。一个参数页面中可以包含多个参数域。参数域可以加说明标题

PreferenceScreen : 所有Preference元素的根节点。相当于一个参数页面,在一个参数页中可以嵌入一个或多个不同的PreferenceScreen,这个参数页也可以是启动其它的页面如activity页面。

显示Preference布局结构的方法为:

使我们的Activity继承PreferenceActivity,然后在onCreate()方法中通过

addPreferencesFromResource(R.xml.custom_preference) (我们自定义的Preference 布局)。


Preference元素的通用XML Attributes说明:

android:key : 每个Preference控件独一无二的”ID”,唯一表示此Preference。

android:defaultValue : 默认值。 例如,CheckPreference的默认值可为”true”,默认为选中状态;

EditTextPreference的默认值可为”110” 。

android:enabled : 表示该Preference是否可用状态。

android:title : 每个Preference在PreferenceScreen布局上显示的标题——大标题

android:summary : 每个Preference在PreferenceScreen布局上显示的标题——小标题(可以没有)

android:persistent: 表示Preference元素所对应的值是否写入sharedPreferen文件中,如果是true,则表示写入;

否则,则表示不写入该Preference元素的值。

android:dependency: 表示一个Preference(用A表示)的可用状态依赖另外一个Preference(用B表示)。

B可用,则A可用;B不可用,则A不可用。

android:disableDependentsState: 与android:dependency相反。B可用,则A不可用;B不可用,则A可用。

常用的方法则包括:

getKey() setKey()

getSummary() setSummary()

getText()setText()

getXXX()代表取得xxx属性的值。


接下来看一下相关的类;

1、使用PreferenceActivity

public abstract class PreferenceActivity extends ListActivity implements

        PreferenceManager.OnPreferenceTreeClickListener

       该类为抽象类,使用时从该类派生子类,既可以实现参数的管理。该类使用的是一个ListView的布局来呈现内容。

       该类拥有一个PreferenceManager实例,用于从activity或者xml文件创建参数树。

 

2、参数管理器PreferenceManager

       这个类用来帮组从activity或者xml文件创建参数树。

该类拥有一个SharedPreferences实例,这个实例指向了一些由他管理的包含了这些参数值的文件。同时,也拥有一个SharedPreferences.Editor实例,该实例从SharedPreferences实例中获得,具有获取和修改参数值的功能。



加载参数树有两种模式,一是从xml文件导出,二是在代码中手动添加。

1、从xml文件导出

       参数树在xml文件中如何配置,配置参数的xml文件可以放在工程目录的res/xml中。

       借助于PreferenceActivity,从它派生子类,并实现Preference.OnPreferenceChangeListener接口。在子类的onCreate方法中,通过调用:

PreferenceActivity.addPreferencesFromResource(int preferencesResId)从指定的参数资源文件中导出参数树。这个参数树由父类PreferenceActivity管理,使用起来很方便。

通过调用:

PreferenceActivity.getPreferenceScreen()可以获得导出的参数树的根对象。

调用PreferenceActivity.findPreference(CharSequence key)可获得指定名字的参数项。

 

2、使用代码手动添加

从PreferenceActivity派生一个子类,在该子类的onCreate方法中手动添加参数树。

(1)、获得参数树的根Preference;

getPreferenceManager().createPreferenceScreen(context).

 

(2)、按参数树的层级关系,创建参数元素,并添加到参数树的对应位置中。

添加使用到方法:PreferenceGroup.addPreference(Preference preference)。参数元素的类级别关系如下:

PreferenceGroup及其子类可以使用addPreference方法添加参数项。

 

创建参数元素时参数的属性设置:

参数元素的属性设置方法可以参看代码,大部分均以“set”开头。xml文件中可以配置的属性,均可以使用代码来配置。

 

(3)、提交参数树

       创建好参数树后,调用PreferenceActivity.setPreferenceScreen(PreferenceScreen preferenceScreen)方法提交参数树,该参数树的内容就能够显示出来。


参数值的读取:

(1)、获取对应的SharedPreferences实例:

调用SharedPreferences pre = PreferenceManager.getDefaultSharedPreferences(Context context)获得。

(2)、使用pre读取参数值:

读取的方法,大多以“get”开头,可以传入默认值。如:

int mWriteColor = pre.getInt("WriteColor", 0xFFFF0000);

如果没有该参数,则返回默认值0xFFFF0000。

 

参数值的保存:

(1)、获取参数值访问接口:

Editor editor = mSharedPref.edit();

其中,mSharedPref为SharedPreferences实例,该实例可以通过PreferenceManager.getDefaultSharedPreferences(Context context)获得;

(2)、写参数值:

通过editor所提供的方法保存参数值,如

editor.putBoolean(KEY_NAME_KEY_SOUND, mKeySound);

是将参数值mKeySound以索引名KEY_NAME_KEY_SOUND保存到SharedPreferences实例所维护的一个数据文件中。

       更多接口方法参看代码。

(3)、提交:

只有在设置好了参数值后并调用如下的方法,最终的参数值才会被保存起来。

editor.commit();

简单的Preference例子:

例子来自http://blog.csdn.net/flowingflying/article/details/6671548

步骤1:编写preference XML,在res/xml/下加入我们的preference XML文件,例如名字叫c21preference.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- preference的组织方式有PreferenceScreen和PreferenceCategory,PreferenceCategory是带层次组织关系,在后面的例子体验,而PreferenceScreen就是最平白和基础的方式 -->
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
   
<!-- 有四个基本组建,这个例子学习两个。里面的内容对照图,很容易理解,RingtonePreference是选择铃音,这里给出两个选择,系统默认的铃音和无声 -->
    <CheckBoxPreference android:key="
checkbox"
        android:title="
CheckBox Preference"
        android:summary="
Check it on , check it off"/>
    <RingtonePreference android:key="
ringtone"
        android:title="
Ringtone Preference"
        android:showDefault="
true"
        android:showSilent="
true"
        android:summary="
Pick a tone, any tone"/>
</PreferenceScreen>

步骤2:在java源代码中调用该xml,生成相应的preference界面

public class Chapter21Test1 extendsPreferenceActivity{
  
 @Override
    protected void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.c21preference);
    }
}

步骤3:获取preference的数据

除了在preference的界面中可以保留数据,我们也希望能够读出数据,以便这些数据可以用在其他的activity中。如果另一个activity和这些数据关联,而且希望能够实时进行同步,在onResume()中对preference保留的数据进行读取,而后进行相关的更新。

首先要获取preferences,然后通过键值对的获取方式根据key获取数值,在xml中checkbox的key为“checkbox”,值的类型为布尔值,而rintong的值为String,例如:

    protected void onResume() { //在另一个Activity中
       
super.onResume();
        SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ;
        System.out.println(new Boolean(prefs.getBoolean("
checkbox",false)).toString());//false表示没有查到checkbox这个key的返回值
        System.out.println(prefs.getString("
ringtone","<unset>"));//<unset>表示没有查到ringtong这个key的返回值
    }

获取preferences可以通过三种方式:
一、getPreferences():可以获取同一activity中的preference;
二、getSharedPreferences():可以获取应用级别的preferences(),在这个例子中由于我们封装在同一app中,也可以使用SharePreferences prefs = getSharedPreferences( "com.wei.android.learning_preferences" ,0);其中第一个参数name的格式是<package_name>_preferences;
三、getDefaultSharedPreferences():就是我们例子的方式,通过Android的偏好管理器来获取其所管理的preferences。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值