zoukankan      html  css  js  c++  java
  • PreferenceActivity用法简介

    在开发应用程序的过程中我们有很大的机会需要用到参数设置功能,那么在Android应用中,我们如何实现参数设置界面及参数存储呢,下面我们来介绍一下Android中的一个特殊Activity–PreferencesActivity。PreferencesActivity是Android中专门用来实现程序设置界面及参数存储的一个Activity,我们用一个实例来简介如何使用PreferencesActivity。
    下图是一个参数设置界面:
    PreferenceActivity用法简介 - moon - 我的官方部落格 android-preference-screen-01.png 
    下载 (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参数来设置控件选中和未选中时的提示。
    PreferenceActivity用法简介 - moon - 我的官方部落格 android-preference-screen-02.png 
    下载 (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>
    复制代码
    PreferenceActivity用法简介 - moon - 我的官方部落格 android-preference-screen-03.png 
    下载 (19.72 KB)
    2010-5-22 10:49
    EditTextPreference:输入框控件,点击后可输入字符串设置。用Title参数设置标题,Summary参数设置说明,dialogTitle参数设置输入框的标题。
    PreferenceActivity用法简介 - moon - 我的官方部落格 android-preference-screen-04.png 
    下载 (20.68 KB)
    2010-5-22 10:49
    RingtonePreference:铃声选择框,点击后可选择系统铃声。Title参数设置标题,Summary参数设置说明,dialogTitle参数设置铃声选择框的标题。
    PreferenceActivity用法简介 - moon - 我的官方部落格 android-preference-screen-05.png 
    下载 (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

    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

    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();
    }
    }


    http://blog.163.com/guozioo@126/blog/static/6408694720106711453584/
    aliyun活动 https://www.aliyun.com/acts/limit-buy?userCode=re2o7acl
  • 相关阅读:
    GridView动态创建TemplateField的回发问题
    ASP.NET页面生命周期
    php图片叠加
    php文件下载
    mysql 常用操作命令
    转载:图解SQL的Join
    利用iframe来做无刷新上传
    php抽象和接口的区别
    php 循环打开目录读取文件
    mysql存储引擎的对比(一)
  • 原文地址:https://www.cnblogs.com/wangbin/p/2293286.html
Copyright © 2011-2022 走看看