PreferenceScreen 偏好显示类 的使用

来源:互联网 发布:日本科研实力知乎 编辑:程序博客网 时间:2024/04/30 07:20
PreferenceScreen preference是偏好,首选的意思,PreferenceScreen个人翻译成 “偏好显示”,明白这个意思就好,就是说根据特点灵活的定义显示内容风格,一个屏幕可以包含多个风格,像系统自带的声音设置界面。

实现这种显示效果其实很简单,只需要借助PreferenceScreen类即可。在项目资源文件中新建xml文件夹,在里面新建preferences.xml文件.
根元素为PreferenceScreen 代表显示一整个屏幕,内部嵌套PreferenceCategory标签,表示偏好类别,在PreferenceCategory标签内部可以随便存放复选框,输入框,列表等显示控件.可包含的控件内容在android.preference包下可查阅.xml文件编写好后,需要加载到activity中,对于偏好显示的xml加载,可以使用PreferenceActivity中的addPreferencesFromResource(),所以Activity需要继承PreferenceActivity.既然显示的屏幕中包含复选框,输入框的控件,我们必然对选择与否,输入框内容感兴趣,我们要怎样获取屏幕的内容呢?
复写activity中的onPreferenceTreeClick 方法,在对屏幕显示的内容进行操作时,会触发此方法,在方法内部通过调用
Java代码 复制代码 收藏代码
  1. SharedPreferences contentPreference = preference.getSharedPreferences();   
  2.      boolean checkbox_toggle = contentPreference.getBoolean("checkbox_preference"false);   
  3.      String animalName = contentPreference.getString("edittext_preference""default");  
 SharedPreferences contentPreference = preference.getSharedPreferences(); boolean checkbox_toggle = contentPreference.getBoolean("checkbox_preference", false); String animalName = contentPreference.getString("edittext_preference", "default");

即可得到屏幕上输入的内容,与使用SharedPreference对象一样,通过key-value 的形式获取,其中key是xml控件标签中key属性对应的值.
显示效果:

对应xml文件:
Java代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <PreferenceScreen   
  3.         xmlns:android="http://schemas.android.com/apk/res/android">   
  4.   
  5.     <PreferenceCategory   
  6.             android:title="显示一排偏好">   
  7.         <CheckBoxPreference   
  8.                 android:key="checkbox_preference"  
  9.                 android:title="开关偏好"  
  10.                 android:summary="这是一个开关按钮" />   
  11.     </PreferenceCategory>   
  12.     <PreferenceCategory   
  13.             android:title="基于对话框的偏好">   
  14.         <EditTextPreference   
  15.                 android:key="edittext_preference"  
  16.                 android:title="文本输入偏好"  
  17.                 android:summary="使用一个文本框对话框"  
  18.                 android:dialogTitle="输入你的宠物" />   
  19.         <ListPreference   
  20.                 android:key="list_preference"  
  21.                 android:title="列表偏好"  
  22.                 android:summary="使用一个列表对话框"  
  23.                 android:entries="@array/entries_list_preference"  
  24.                 android:entryValues="@array/entryvalues_list_preference"  
  25.                 android:dialogTitle="选择一个" />   
  26.     </PreferenceCategory>   
  27.     <PreferenceCategory   
  28.             android:title="启动偏好">   
  29.         <PreferenceScreen   
  30.                 android:key="screen_preference"  
  31.                 android:title="屏幕"  
  32.                 android:summary="显示另一个偏好屏幕">   
  33.                
  34.             <!-- You can place more preferences here that will be shown on the next screen. -->   
  35.                         
  36.             <CheckBoxPreference   
  37.                     android:key="next_screen_checkbox_preference"  
  38.                     android:title="开关偏好"  
  39.                     android:summary="另一个屏幕上的偏好" />   
  40.         </PreferenceScreen>   
  41.   
  42.         <PreferenceScreen   
  43.                 android:title="意图偏好"  
  44.                 android:summary="通过意图启动一个Activity">   
  45.             <intent android:action="android.intent.action.VIEW"  
  46.                     android:data="http://www.android.com" />   
  47.         </PreferenceScreen>   
  48.     </PreferenceCategory>   
  49.     <PreferenceCategory   
  50.             android:title="偏好属性">   
  51.         <CheckBoxPreference   
  52.                 android:key="parent_checkbox_preference"  
  53.                 android:title="父开关"  
  54.                 android:summary="这是一个父开关" />   
  55.         <CheckBoxPreference   
  56.                 android:key="child_checkbox_preference"  
  57.                 android:dependency="parent_checkbox_preference"  
  58.                 android:layout="?android:attr/preferenceLayoutChild"  
  59.                 android:title="子开关"  
  60.                 android:summary="这是一个子开关" />   
  61.     </PreferenceCategory>   
  62. </PreferenceScreen>

another case

 

‍在开发应用程序的过程中我们有很大的机会需要用到参数设置功能,那么在Android应用中,我们如何实现参数设置界面及参数存储呢,下面我们来介绍一下Android中的一个特殊Activity–PreferencesActivity。PreferencesActivity是Android中专门用来实现程序设置界面及参数存储的一个Activity,我们用一个实例来简介如何使用PreferencesActivity。
下图是一个参数设置界面:

下载 (23.65 KB)
2010-5-22 10:49
以此为例我们来介绍一下如何实现这个界面。首先建立一个xml来描述这个界面,文件为res/xml/preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory android:title="PreferenceCategory 1">
        <CheckBoxPreference
            android:key="CheckBox1"
            android:title="CheckBox"
            android:summaryOn="某功能: 开启"
            android:summaryOff="某功能: 关闭"
            android:defaultValue="true"
        />
    </PreferenceCategory>
    <PreferenceCategory android:title="PreferenceCategory 2">
        <PreferenceScreen android:title="二级PreferenceScreen">
            <CheckBoxPreference
                android:key="CheckBox2"
                android:title="CheckBox"
                android:summaryOn="某功能: 开启"
                android:summaryOff="某功能: 关闭"
                android:defaultValue="true"
            />
        </PreferenceScreen>
    </PreferenceCategory>
    <PreferenceCategory android:title="PreferenceCategory 3">
    <ListPreference
        android:key="ListPreference"
        android:title="ListPreference"
        android:summary="ListPreference测试"
        android:dialogTitle="ListPreference"
        android:entries="@array/entries_list_preference"
        android:entryValues="@array/entriesvalue_list_preference"
    />
    <EditTextPreference
        android:key="EditTextPreference"
        android:title="EditTextPreference"
        android:summary="点击输入"
        android:dialogTitle="输入设置"
    />
    <RingtonePreference
        android:key="RingtonePreference"
        android:title="RingtonePreference"
        android:summary="选择铃声"
    />
    </PreferenceCategory>
</PreferenceScreen>
复制代码
这个例子中包括了PreferenceActivity中常见的几种组件,以下为具体介绍及用法:
PreferenceScreen:设置页面,可嵌套形成二级设置页面,用Title参数设置标题。
PreferenceCategory:某一类相关的设置,可用Title参数设置标题。
CheckBoxPreference:是一个CheckBox设置,只有两种值,true或false,可用Title参数设置标题,用summaryOn和summaryOff参数来设置控件选中和未选中时的提示。

下载 (14.01 KB)
2010-5-22 10:49
ListPreference:下拉框选择控件,用Title参数设置标题,用Summary参数设置说明,点击后出现下拉框,用dialogTitle设置下拉框的标题,下拉框内显示的内容和具体的值需要在res/values/array.xml中设置两个array来表示。图中的array.xml设置如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="entries_list_preference">
    <item>test1</item>
    <item>test2</item>
    <item>test3</item>
</string-array>
<string-array name="entriesvalue_list_preference">
    <item>1</item>
    <item>2</item>
    <item>3</item>
</string-array>
</resources>
复制代码

下载 (19.72 KB)
2010-5-22 10:49
EditTextPreference:输入框控件,点击后可输入字符串设置。用Title参数设置标题,Summary参数设置说明,dialogTitle参数设置输入框的标题。

下载 (20.68 KB)
2010-5-22 10:49
RingtonePreference:铃声选择框,点击后可选择系统铃声。Title参数设置标题,Summary参数设置说明,dialogTitle参数设置铃声选择框的标题。

下载 (20.36 KB)
2010-5-22 10:49
以上是PreferenceActivity的xml描述,那么在程序中我们只需要新建一个继承自PreferenceActivity的Activity,然后在主程序中调用就可以了。这个PreferenceActivity中的设置存储是完全自动的,你不需要再用代码去实现设置的存储,PreferenceActivity创建后会自动创建一个配置文件/data/data/you_package_name/shared_prefs/you_package_name_you_xml_name.xml。上例中自动生成的配置文件如下:<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="EditTextPreference">12332312</string>
<string name="ListPreference">2</string>
<string name="RingtonePreference">content://settings/system/ringtone</string>
<boolean name="CheckBox1" value="true" />
<boolean name="CheckBox2" value="true" />
</map>
复制代码
要取得其中的值可以通过如下的方法:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
value = prefs.getString(”ListPreference”, “unset”);

 

 

 

 

 

 

 

 

 

设计自己的Android Preference

SeekBar Preference


 

Android提供了Preference供应用可以进行功能设置以及属性配置等操作,检查android.preference可以看到Preference下有若干子类,例如常用的EditTextPreference、CheckBoxPreference、ListPreference等。但是仅仅有这些是不够的。

在我现在的工作当中,应用里有这么一个场景,用户手指在屏幕滑动,应用绘制出移动的轨迹。

熟悉Android API Demo(可以在SDK/platforms/android-1.5/samples下找到)的人一定记得在graphics目录下,有一个FingerPaint的类实现了类似上述功能。但是还远远实现不了我们的需要,–需求是要在Preference中实现挑选颜色和调整粗细。

当然,他山之石可以攻玉,FingerPaint还是提供了不错的例子,尤其是FingPaint中选择颜色所使用的另外一个类ColorPickerDialog基本上具备了我们想要的部分功能。

除了上面提到的FingerPaint之外,还可以从Android的源码中找到可以参考的代码。从framework/base/core/java中,找到android.preference包,可以看到有一个SeekBarPreference的类,–这是一个“烂尾”类,代码未完成,因此被Google打上了@hide的标签。因此需要稍加完善,才能加以使用。


 

@Override

protected void onBindDialogView(View view) {

    super.onBindDialogView(view); 

     bar = (SeekBar) view.findViewById(R.id.seekbar);

     bar.setOnSeekBarChangeListener(this); bar.setProgress(barValue);

         public void setValue(int value) {

                 barValue = value;

                                                  } 

                                 public int getValue() {

                                         return barValue;} 

     @Override

   protected void onDialogClosed(boolean positiveResult) {

              if (positiveResult) { 

                   this.getOnPreferenceChangeListener().onPreferenceChange(this, barValue);

                    }

      }



Color Picker Preference


 

在这个类的改造过程中,override两个父类方法是关键所在,一个是onBindDialogView,另一个是onDialogClosed。

通过第一个方法,我们可以“找到”被当做content view的SeekBar的实例,进而可以获得到其progress。

通过第二个方法,我们可以方便的通知到Listener,告诉它,SeekBar的值有变化。这里我们把SeekBar的值,即progress看做是SeekBarPreference的value。除了这两个方法之外,就是要增加setValue和getValue两个方法了。

如果不看代码的话,就会有疑问:SeekBar是如何进入Diglog的呢?它正式通过DialogPreference的属性android:dialogLayout得以注入:


 

<net.poemcode.android.config.SeekBarPreference

                         android:key="@string/setting_handwrite_width_key"

                         android:title="@string/setting_handwrite_width_title"

                         android:dialogTitle="@string/setting_handwrite_width_title"

                         android:dialogLayout="@layout/setting_widthseekbar"

                         android:persistent="true"/>


 

依此原理,可以举一反三,对于如何实现选择颜色是不是有了思路?

首先实现一个视图,负责展现不同颜色和接收用户选中的颜色,其可以从SeekBarPreference中的内部类ColorPickerView加以改造完成;然后新增一个布局文件,将刚才的视图加入到布局当中;接着继承DialogPreference实现自己的Preference子类ColorPickerPreference;最后在XML文件里增加这个Preference并把刚才的布局文件通过dialogLayout属性加入进去。从而实现了整个功能。


 

   public class SeekBarPreference extends DialogPreference implements

           SeekBar.OnSeekBarChangeListener {  

              private static final String TAG = "SeekBarPreference"; 

              private SeekBar bar;  private int barValue; 

              public SeekBarPreference(Context context, AttributeSet attrs)

                       super(context, attrs);

                    } 

@Override

            protected void onBindDialogView(View view) {

                       super.onBindDialogView(view); 

                       bar = (SeekBar) view.findViewById(R.id.seekbar);

                      bar.setOnSeekBarChangeListener(this);

                      bar.setProgress(barValue); } 

            public void setValue(int value) {

                      barValue = value;

           }  

       public int getValue()

           {

              return barValue;

            } 

   @Override

            protected void onDialogClosed(boolean positiveResult)

               {

                      if (positiveResult)

                           {

                                 this.getOnPreferenceChangeListener().onPreferenceChange(this, barValue);

                          }

              } 

           public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)

                       {

                          Log.d(TAG, "onProgressChanged, progress : "

                                            + progress + ", fromUser : " + fromUser);

                                 } 

            public void onStartTrackingTouch(SeekBar seekBar)

               {

                       Log.d(TAG, "onStartTrackingTouch");

              } 

             public void onStopTrackingTouch(SeekBar seekBar)

                      {

                                 barValue = seekBar.getProgress();

                      }

  }

 

原创粉丝点击