`
jaymsimusic
  • 浏览: 92633 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

PreferenceActivity用法简介

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



以此为例我们来介绍一下如何实现这个界面。首先建立一个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参数来设置控件选中和未选中时的提示。




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>




EditTextPreference:输入框控件,点击后可输入字符串设置。用Title参数设置标题,Summary参数设置说明,dialogTitle参数设置输入框的标题。



RingtonePreference:铃声选择框,点击后可选择系统铃声。Title参数设置标题,Summary参数设置说明,dialogTitle参数设置铃声选择框的标题。


以上是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();
    }
}
  • 大小: 23.6 KB
  • 大小: 14 KB
  • 大小: 19.7 KB
  • 大小: 20.7 KB
  • 大小: 20.4 KB
  • 大小: 17.5 KB
  • 大小: 20.3 KB
分享到:
评论

相关推荐

    PreferenceActivity用法简介Android X

    PreferenceActivity用法简介 Android X

    PreferenceActivity 类的使用,它可以保存设置

    这个示例 PreferenceActivity 类的用法,它可以保存设置

    PreferenceActivity

    SharedPreferences使用方便,所以经常用SharedPreferences保存配置信息。Android SDK提供的更容易的方法,这就是PreferenceActivity。

    Android至PreferenceActivity

    android 开发者指南 ,我们看到Android系统本身就大量...看出来了吧,Preference,对就是使用SharedPreferneces以键值对的形式进行保存的,当然,我们也可以通过SharedPreferences来获取PreferenceActivity设置的值。

    android 开发技巧合集

    2.1.9、PreferenceActivity 用法 22 2.1.10、Dialog风格的Activity 23 2.1.11、横竖屏切换不销毁当前Activity 23 2.2、INTENT RECEIVER 25 2.3、SERVICE 26 2.3.1、什么是Service 26 2.3.2、如何使用Service 27 ...

    Android开发技巧总汇(个人总结)

    16.PreferenceActivity 用法 22 17.通过HttpClient从指定server获取数据 22 18.拖动Button获得位置 23 19.代码安装apk包 25 20.给模拟器打电话发短信 26 21.从google搜索内容 26 22.浏览网页 26 23.显示地图...

    PreferencexmlDemo.zip

    1、使用XML定义Preference。 2、运行环境android studio。 3、此方法有点过时,不太建议使用,但目前还可以用。让Activity继承PreferenceActivity,然后在重写onCreate方法,添加preferences.xml作为显示界面。

    PreferenceDemo(包含回调方法)

    PreferenceFragment偏好设置的Demo,它会自动保存用户数据,上次修改后下一次自动生效,不需要重新配置。用它来做app的设置界面或者...Android3.0以前我们使用PreferenceActivity基类去显示给用户一个选项设置的界面。

    slidingmenu

    1.可能报找不到getSupportActionBar等ActionBarSherLock的方法。原因是使用ActionBarSherLock的Activity需继承于SherlockActivity,修改SlidingMenu liberary(slidingmenu_lib)中的 SlidingFragmentActivity,让它...

    Android布局——Preference自定义layout的方法

    导语:PreferenceActivity是一个方便设置管理的界面,但是对于界面显示来说比较单调,所以自定义布局就很有必要了。本文举例说明在Preference中自定义layout的方法。笔者是为了在设置中插入@有米v4广告条才研究了一...

    Android 开发技巧

    2.1.9、PreferenceActivity 用法 22 2.1.10、Dialog风格的Activity 23 2.1.11、横竖屏切换不销毁当前Activity 23 2.2、INTENT RECEIVER 25 2.3、SERVICE 26 2.3.1、什么是Service 26 2.3.2、如何使用Service 27 ...

    Android开发资料合集-World版!

    2.1.9、PreferenceActivity 用法 22 2.1.10、Dialog风格的Activity 23 2.1.11、横竖屏切换不销毁当前Activity 23 2.2、INTENT RECEIVER 25 2.3、SERVICE 26 2.3.1、什么是Service 26 2.3.2、如何使用Service 27 ...

    android-ipcam:基于libstreaming库的安卓IP摄像头

    在工具栏上有投两个按钮(这将启动/停止RTSP服务器-流媒体),并设置导致PreferenceActivity。 首次运行应用程序时需要指定服务器 url。 默认情况下,我的本地服务器 ( ) 设置了一个 IP 地址。 转到设置并更改唯一...

    ColorPickerPreference-功能很完善的颜色选择控件.zip

    功能很完善的颜色选择控件,不过,demo只是演示了如何在PreferenceActivity中ColorPickerPreference,其实完全可以在一般的布局中调用它的ColorPickerDialog类,这样适用范围更广一些。项目地址:...

Global site tag (gtag.js) - Google Analytics