Android PreferenceActivity 学习笔记

 

在Ap中有时需要设置一些配置参数,这些参数通过配置文件保存。
为了设置这些参数,需要提供一个UI,针对这种需求,Android提供了preferenceActivity。

PreferenceActivity通过读取预先定义的xml文件来生成界面,并能够自动的根据用户的操作来修改参数,并保存到配置文件中供读取。

1.MainActivity:
按下Menu按键弹出菜单,点击菜单启动SettingActivity。
2.SettingActivity继承自PreferenceActivity:

@Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  addPreferencesFromResource(R.xml.settings);
 }
在onCreate函数中加载参数定义文件。

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key);
当参数值被改变时会调用此Listener,可以在此Listener中作一些界面刷新工作,比如当前参数值改变为新的值。

Preference android.preference.PreferenceActivity.findPreference(CharSequence key);
获取指定key所对应的preference对象,即使此key在配置文件中尚未保存,也能够得到preference对象,而不会是null。
3.settings.xml:保存在xml目中的参数定义文件,在创建Android XML文件时选择Preference即可创建一个空的参数定义文件。

<?xml version="1.0" encoding="utf-8"?>
 <PreferenceScreen
   xmlns:android="http://schemas.android.com/apk/res/android">
 </PreferenceScreen>
添加一个CheckBoxPreference子项,并设置属性:
Key:checkbox_key
Title:CheckBox Item
Summary:test check box item

<?xml version="1.0" encoding="utf-8"?>
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
 <CheckBoxPreference android:key="checkbox_key"
  android:title="CheckBox Item" android:summary="test check box item"></CheckBoxPreference>
 </PreferenceScreen>
key是用来访问此参数的值的关键字,保存后的配置文件类似如下内容:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
 <map>
  <boolean name="checkbox_key" value="true" />
 </map>
启动Ap,点击菜单,即可看到参数设置界面,并且当用户点击操作改变了参数值后,也会被自动保存。
4.使用参数值:
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
        boolean check_test = sp.getBoolean("checkbox_key", false);

进阶:
1.保存参数文件的路径:
/data/data/包名/shared_prefs/包名_preferences.xml
如果想指定保存文件名,可使用:
getPreferenceManager().setSharedPreferencesName("配置文件名");
2.其他的参数配置项:
2.1 EditTextPreference:

<EditTextPreference android:dialogTitle="Edit Text Dialog"
  android:key="edittext_key" android:dialogMessage="Please Input text"
  android:title="EditText Item" android:summary="test edittext item"></EditTextPreference>
此参数设置项会弹出一个文本输入对话框,并在配置文件中生成类似以下内容:
<string name="edittext_key">this is a good text</string>
弹出对话框的图标、标题、提示信息、Icon、以及两个按钮的文本都可以设定。
至于自定义对话框的布局,虽然有这个属性,但是自定义布局后就不能自动保存值了,
本来以为只要放一个ID和原来一样的EditText就能,但是查看源代码,发现其EditText是new出来的,没法替代。
2.2 PreferenceCategory:一个分类分隔条。只有title属性有效。
2.3 PreferenceScreen:此项包含的所有子项在新屏幕上显示,就好像进入二级菜单。
2.4 ListPreference:会弹出一个列表对话框供选择。
2.5 RingtonePreference:会弹出系统铃声列表供选择。
2.6 Preference:通用参数项。点击后需要程序自己响应事件。
3.自定义选项:
系统的提供的界面有时不能满足需要,这时就需要自定义选项了。
有两种方法可以实现自定义选项,一是用Preference作为选项,并重新实现onPreferenceTreeClick函数。
一是自定义一个类,类似于EditTextPreference这种系统内置的类,然后引用。
3.1使用一个Preference占位,然后重新实现onPreferenceTreeClick()函数:

public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
  String key = preference.getKey();
  if( key != null ){
   if(key.equals("some_key")) {
    showDialog(DIALOG_SOME_KEY);
   }
  }
  return super.onPreferenceTreeClick(preferenceScreen, preference);
 }
当点击指定key的Preference时,就会弹出对话框,然后在合适的时机使用如下代码保存参数即可。

SharedPreferences.Editor editor = preference.getEditor();
 editor.putLong("ttt", 123);
 editor.commit();
此种方法如果要触发onSharedPreferenceChanged(),可以通过preference.getOnPreferenceChangeListener()获取listener然后来呼叫。
3.2自定义选项类:
此处以一个选择时间的对话框选项为例。
3.2.1 从DialogPreference继承一个类:

public class TimePreference extends DialogPreference
3.2.2 构造函数:

public TimePreference(Context context, AttributeSet attrs) {
  super(context, attrs);  
  setDialogLayoutResource(R.layout.time_preference); //加载布局文件
 }
3.3.3 布局文件:

<?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent">
 <TimePicker android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/timePicker_preference" android:layout_centerHorizontal="true"></TimePicker>
 </RelativeLayout>
定义了一个id为timePicker_preference的TimePicker。
3.3.4 界面初始化:在dialog的函数中通过id找到TimePicker,然后使用已经存储的值或者默认值,再设置到TimerPicker中。

@Override
 protected void onBindDialogView(View view) {
  super.onBindDialogView(view);
    
  mPicker = (TimePicker)view.findViewById(R.id.timePicker_preference);
  if(mPicker != null) {   
   mPicker.setIs24HourView(true);
   long value = mValue;
   Date d = new Date(value);
   mPicker.setCurrentHour(d.getHours());
   mPicker.setCurrentMinute(d.getMinutes());
  }
  
 }
3.3.5 保存值:在对话框关闭时保存值。

@Override
 protected void onDialogClosed(boolean positiveResult) {
  super.onDialogClosed(positiveResult);
  if(positiveResult) {    
   Date d = new Date(0, 0, 0, mPicker.getCurrentHour(), mPicker.getCurrentMinute(), 0);   
   long value = d.getTime();
   if(callChangeListener(value)) {
    setValue(value);
   }
  }
 }

3.3.6 使用此preference:
在参数定义文件中增加:

<cn.demo.pa.TimePreference android:key="time_test" android:title="Test time preference"/>
类似于使用自定义控件。

运行即可看到效果: 
 
3.3.7 使用默认值:
在参数定义文件中增加一个定义:

<cn.demo.pa.TimePreference android:key="time_test" android:title="Test time preference" android:defaultValue="1000000"/>
并且自定的preference类中要实现两个函数:

@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
 return a.getString(index);
}
以及
       
@Override
 protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
  long value;
  if(restorePersistedValue) value = getPersistedLong(0);
  else {
   value = Long.parseLong(defaultValue.toString());
  }
        setValue(value);
 }
当PreferenceActivity启动时会构造TimePreference,此时会调用onGetDefaultValue,然后调用onSetInitialValue,在onSetInitialValue保存初始值,并在onBindDialogView中使用保存的值从而可以使用默认值。

文章来自: 程序员俱乐部(www.cxyclub.cn) 详文参考:http://www.cxyclub.cn/n/4879/

时间: 2024-10-27 11:35:22

Android PreferenceActivity 学习笔记的相关文章

友善之臂Mini6410之Android开发学习笔记(4)-EEPROM Demo

友善之臂Mini6410之Android开发学习笔记源码同步更新,请使用git工具进行同步.关于Git工具更多信息,请参考:http://progit.org/book/zh/ git clone https://code.google.com/p/androiddemoformini6410/ EEPROMActivity.java package com.mini6410.EEPROM; import android.app.Activity; import android.os.Bundl

友善之臂Mini6410之Android开发学习笔记(1)-LED Demo

友善之臂Mini6410之Android开发学习笔记源码同步更新,请使用git工具进行同步.关于Git工具更多信息,请参考:http://progit.org/book/zh/ git clone https://code.google.com/p/androiddemoformini6410/ LEDActivity.java package com.mini6410.LED; import com.friendlyarm.AndroidSDK.HardwareControler; impor

Android 数字签名学习笔记

  Android 数字签名学习笔记    在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的protectionLevel为signature,那么就只有那些跟该permission所在的程序拥有同一个数字证书的应用程序才能取得该权限.Android使用Java的数字证书相关的机制来给apk加盖数字证书,要理解android的数字证书,需要先了解以下数字证书的概念和java的数字证书机

友善之臂Mini6410之Android开发学习笔记(3)-ADC Demo

友善之臂Mini6410之Android开发学习笔记源码同步更新,请使用git工具进行同步.关于Git工具更多信息,请参考:http://progit.org/book/zh/ git clone https://code.google.com/p/androiddemoformini6410/ ADCActivity.java package com.mini6410.ADC; import java.util.Timer; import java.util.TimerTask; import

友善之臂Mini6410之Android开发学习笔记(2)-PWM Demo

友善之臂Mini6410之Android开发学习笔记源码同步更新,请使用git工具进行同步.关于Git工具更多信息,请参考:http://progit.org/book/zh/ git clone https://code.google.com/p/androiddemoformini6410/ PWMActivity.java package com.mini6410.PWM; import android.app.Activity; import android.os.Bundle; imp

Android开发学习笔记之通过API接口将LaTex数学函数表达式转化为图片形式_Android

本文将讲解如何通过codecogs.com和Google.com提供的API接口来将LaTeX数学函数表达式转化为图片形式.具体思路如下:       (1)通过EditText获取用户输入的LaTeX数学表达式,然后对表达式格式化使之便于网络传输.       (2)将格式化之后的字符串,通过Http请求发送至codecogs.com或者Google.com.       (3)获取网站返回的数据流,将其转化为图片,并显示在ImageView上. 具体过程为: 1.获取并格式化LaTeX数学表

Android开发学习笔记 Gallery和GridView浅析_Android

一.Gallery的简介 Gallery(画廊)是一个锁定中心条目并且拥有水平滚动列表的视图,一般用来浏览图片,并且可以响应事件显示信息.Gallery还可以和ImageSwitcher组件结合使用来实现一个通过缩略图来浏览图片的效果. Gallery常用的XML属性 属性名称 描述 android:animationDuration 设置布局变化时动画的转换所需的时间(毫秒级).仅在动画开始时计时.该值必须是整数,比如:100. android:gravity 指定在对象的X和Y轴上如何放置内

Android开发学习笔记 Gallery和GridView浅析

一.Gallery的简介 Gallery(画廊)是一个锁定中心条目并且拥有水平滚动列表的视图,一般用来浏览图片,并且可以响应事件显示信息.Gallery还可以和ImageSwitcher组件结合使用来实现一个通过缩略图来浏览图片的效果. Gallery常用的XML属性 属性名称 描述 android:animationDuration 设置布局变化时动画的转换所需的时间(毫秒级).仅在动画开始时计时.该值必须是整数,比如:100. android:gravity 指定在对象的X和Y轴上如何放置内

Android开发学习笔记 浅谈WebView_Android

第一种方法的步骤: 1.在要Activity中实例化WebView组件:WebView webView = new WebView(this); 2.调用WebView的loadUrl()方法,设置WevView要显示的网页:   互联网用:webView.loadUrl("http://www.google.com");   本地文件用:webView.loadUrl("file:///android_asset/XX.html"); 本地文件存放在:assets