zoukankan      html  css  js  c++  java
  • Android的配置界面PreferenceActivity

    原文地址:http://www.cnblogs.com/zhangdongzi/archive/2012/01/05/2313519.html

    我想大家对于android的系统配置界面应该不会陌生吧,即便陌生,那么下面的界面应该似曾相识吧,假若还是不认识,那么也没有关系,我们这一节主要就是介绍并讲解android 中系统配置界面的使用,相信大家看完本节后,一定能知道怎么使用这些东西了。

    从上述界面中(其实是一个界面),我们可以看到有2组元素,第一组为:自动更新,更新频率。第二组为:是否登录,账号,密码。

    其实分组是为了方便管理而已。这里主要使用到了选择,列表,编辑框等Preference.

    我们还是来温习下基础知识吧。

    一.基础知识

    通常我们开发一个程序时,会需要给用户提供一个设置界面,使用户可以对程序的一些参数进行设置。通常我们使用Preferences的键值对存储方式,来对Android数据持久化。

    android.content.SharedPreferences是一个接口,用来获取和修改持久化存储的数据。有三种方式可以获取系统中持久化的数据,这些数据时存放在.xml中的:

    1:public SharedPreferences getPreferences (int mode),只隶属于activity对象,并以这个对象为文件名。

    2:public SharedPreferences getSharedPreferences (String name, int mode),隶属于整个应用,以name名称保存。

    3:public static SharedPreferences getDefaultSharedPreferences (Context context),隶属于整个应用,保存PreferenceActivity中的设置,根据包名和PreferenceActivity的布局文件来起一个名字保存。

    SharedPreferences可以保存BooleanIntFloatLongString等类型。一般是SharedPreferences.Editor的putXXX()方法保存,并commit()方法提交;或者是remove(),方法移除,clear()方法清空,当然操作完毕后需要commit()方法提交。

        一般的,可以使用SharedPreferences保存持久化数据,比如登陆账号,密码,以及相对固定设置参数等等,看你应用需要。

        既然使用到设置参数界面,那么我们可以来认识下一下几个类标签:

    1:PreferenceScreen 持久化设置界面的顶级容器,代表一屏,里面可以嵌套屏幕,嵌套的时候可以点击跳转到另外一屏。

    2:PreferenceCategory 当前屏的分组容器,说白了,就是为了划分组而已。

    3:CheckBoxPreference,ListPreference,EditTextPreference等等组件。这些都是常见的对应上述的选择标签、列表标签、编辑标签。

    上述组件都有titile,summary,key属性。title标题描述,summary:详细描述,key:保存SharedPreferences时候的键。

     

    二.实战

    既然有了上述基础知识后,我们就可以来做如上的设置界面了,在上述界面中,我们知道当前配置界面只需一屏,没有额外的跳转,那么需要PreferenceScreen,不需要嵌套其他PreferenceScreen,而设置界面分为两栏,那么需要两个PreferenceCategory,并且这个PreferenceCategory可以设置标题。同时根据界面,我们还需要CheckBoxPreference,ListPreference,EditTextPreference等。操作如图:

     

    当然了,我们还是实际操作下吧,然后实际联系理论(理论联系实际太抽象),我们首先编写使用工具选择标签,然后形成代码,存放在xml文件夹中,如下:

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    android:title="@string/setting" >
    <PreferenceCategory android:title="@string/update" >
    <CheckBoxPreference
    android:key="@string/update_key"
    android:summaryOn="@string/auto_update_switch_summary_on"
    android:summaryOff="@string/auto_update_switch_summary_off"
    android:summary="@string/auto_update_setting"
    android:title="@string/auto_update_switch_title"
    android:defaultValue="true"
    />
    <ListPreference
    android:key="@string/auto_update_frequency_key"
    android:dialogTitle="@string/auto_update_frequency_title"
    android:entries="@array/auto_frequency_name"
    android:entryValues="@array/auto_frequency_value"
    android:negativeButtonText="@string/cancel"
    android:summary="@string/auto_update_frequency_summary"
    android:title="@string/auto_update_frequency_title" />
    </PreferenceCategory>
    <PreferenceCategory android:title="@string/other" >
    <CheckBoxPreference
    android:key="@string/isneilflag_key"
    android:title="@string/isneilflag"
    android:disableDependentsState="true"
    />
    <EditTextPreference
    android:dependency="@string/isneilflag_key"
    android:key="@string/username_key"
    android:summary="@string/username_summary"
    android:title="@string/username" />
    <EditTextPreference
    android:dependency="@string/isneilflag_key"
    android:key="@string/password_key"
    android:summary="@string/password_summary"
    android:title="@string/password" />
    </PreferenceCategory>
    </PreferenceScreen>
    复制代码

    当然这里使用到了一些文件,代码一并释放:

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <resources>

    <string name="hello">Hello World, PreferenceActivityDemoActivity!</string>
    <string name="app_name">PreferenceActivityDemo</string>
    <string name="cancel">取消</string>
    <string name="other">其他</string>
    <string name="setting">设置</string>
    <string name="update">更新</string>
    <string name="auto_update_switch_title">自动更新</string>
    <string name="auto_update_setting">自动更新设置</string>
    <string name="auto_update_switch_summary_on">开启自动更新</string>
    <string name="auto_update_switch_summary_off">关闭自动更新</string>
    <string name="auto_update_frequency_title">更新频率</string>
    <string name="auto_update_frequency_summary">设置更新周期</string>

    <string name="isneilflag">是否匿名登录</string>
    <string name="username">帐号</string>
    <string name="password">密码</string>
    <string name="username_summary">提供您帐号</string>
    <string name="password_summary">提供您密码</string>


    <string name="update_key">update_key</string>
    <string name="auto_update_frequency_key">auto_update_frequency_key</string>
    <string name="isneilflag_key">isneilflag_key</string>
    <string name="username_key">username_key</string>
    <string name="password_key">password_key</string>
    </resources>
    复制代码
    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <string-array name="auto_frequency_name">
    <item>10分钟</item>
    <item>30分钟</item>
    <item>1小时</item>
    <item>12小时</item>
    </string-array>

    <string-array name="auto_frequency_value">
    <item>10</item>
    <item>30</item>
    <item>60</item>
    <item>720</item>
    </string-array>
    </resources>
    复制代码

    接下来,我们就来解释下xml文件夹中设置文件的一些内容吧:

     android:key="@string/update_key"   这个是我们持久化时SharedPreferences保存的键,
                android:summaryOn="@string/auto_update_switch_summary_on"     选中后显示内容
                android:summaryOff="@string/auto_update_switch_summary_off"     未选中后显示内容
                android:summary="@string/auto_update_setting"                             平常状态显示内容
                android:title="@string/auto_update_switch_title"                               标题
                android:defaultValue="true"                                                             默认值
      android:dialogTitle="@string/auto_update_frequency_title"                           对话框标题
                android:entries="@array/auto_frequency_name"                                列表项显示名称
                android:entryValues="@array/auto_frequency_value"                          列表项值

      android:disableDependentsState="true"          当CheckBoxPreference的值为真的时候,禁用依赖于该设置的其他设置项。

      android:dependency="@string/isneilflag_key"  根据上述设置依赖于CheckBoxPreference的真值进行启用与禁用。

      注意:我们可以从上图知道ListPreference是继承之Preference,以及DialogPreference的,那么就有它们的属性以及方法了。

     好了,设置界面已经定义完成,我们来定义一个activity继承之PreferenceActivity,并使之显示吧。

     当然噩梦可以再使之继承接口OnPreferenceChangeListener,OnPreferenceClickListener,PreferenceActivity中的某一个Preference进行了点击或者改变的操作时,都会回调接口中的函数。

    具体代码如下:

    复制代码
    package com.dongzi;

    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.preference.CheckBoxPreference;
    import android.preference.EditTextPreference;
    import android.preference.ListPreference;
    import android.preference.Preference;
    import android.preference.Preference.OnPreferenceChangeListener;
    import android.preference.Preference.OnPreferenceClickListener;
    import android.preference.PreferenceManager;
    import android.preference.PreferenceActivity;
    import android.util.Log;
    public class PreferenceActivityDemoActivity extends PreferenceActivity
    implements OnPreferenceChangeListener,OnPreferenceClickListener{
    static final String TAG="PreferenceActivityDemoActivity";
    SharedPreferences preference=null;
    CheckBoxPreference updateCheckBoxPreference=null;
    ListPreference lististPreference=null;
    CheckBoxPreference isneilflag_CheckBoxPreference=null;
    EditTextPreference usernameEditTextPreference=null;
    EditTextPreference passwordEditTextPreference=null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //设置显示Preferences
    addPreferencesFromResource(R.xml.preference);
    //获得SharedPreferences
    preference=PreferenceManager.getDefaultSharedPreferences(this);

    //找到preference对应的Key标签并转化
    updateCheckBoxPreference=(CheckBoxPreference)findPreference(getString(R.string.update_key));
    lististPreference=(ListPreference)findPreference(getString(R.string.auto_update_frequency_key));
    isneilflag_CheckBoxPreference=(CheckBoxPreference)findPreference(getString(R.string.isneilflag_key));
    usernameEditTextPreference=(EditTextPreference)findPreference(getString(R.string.username_key));
    passwordEditTextPreference=(EditTextPreference)findPreference(getString(R.string.password_key));
    //为Preference注册监听
    updateCheckBoxPreference.setOnPreferenceChangeListener(this);
    updateCheckBoxPreference.setOnPreferenceClickListener(this);

    lististPreference.setOnPreferenceClickListener(this);
    lististPreference.setOnPreferenceChangeListener(this);

    isneilflag_CheckBoxPreference.setOnPreferenceChangeListener(this);
    isneilflag_CheckBoxPreference.setOnPreferenceClickListener(this);

    usernameEditTextPreference.setOnPreferenceChangeListener(this);
    passwordEditTextPreference.setOnPreferenceChangeListener(this);
    }
    @Override
    public boolean onPreferenceClick(Preference preference) {
    //判断是哪个Preference改变了
    if(preference.getKey().equals(getString(R.string.update_key))){
    Log.e(TAG, getString(R.string.update_key));
    }else if(preference.getKey().equals(getString(R.string.isneilflag_key))){
    Log.e(TAG, getString(R.string.isneilflag_key));
    }
    //返回true表示允许改变
    return true;
    }
    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
    //判断是哪个Preference改变了
    if(preference.getKey().equals(getString(R.string.username_key))){
    //账号
    Log.e(TAG, getString(R.string.username_key));
    }else if(preference.getKey().equals(getString(R.string.password_key))){
    //密码
    Log.e(TAG, getString(R.string.password_key));

    }else if(preference.getKey().equals(getString(R.string.auto_update_frequency_key))){
    //列表
    Log.e(TAG, getString(R.string.auto_update_frequency_key));
    }
    //返回true表示允许改变
    return true;
    }
    }
    复制代码

    从上述代码可知: 

    1:设置显示Preferences可以调用方法addPreferencesFromResource(R.xml.preference); 传递preference文件即可。

    2:然后通过findPreference();方法找到键的类标签

    3:我们定义2个监听接口监听参数是否设置成功。

    4:在监听接口中返回true就是设置允许提交。

    结果打印如下:

    成功!

    也许你会问,我们这里并没有使用

    SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);

    settings.getXXXX();settings.putXXXX();以及commit()等方法,设置、获取并提交值啊?!是的,在这里我们不需这样,因为

    PreferenceActivity中的内容改变时,Android系统会自动进行保存和持久化维护,我们只需要在要用的设置界面中数据的地方进行读取就可以了。

    当然,您可以在其他界面使用SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);等类方法来获取数据,看能不能获取到

    文章转载于网络,如有侵权,请原创留言;内容如有不妥,请各位园友提宝贵意见或建议。所有文章均处于编辑状态。。。。。。百度贴吧:流水小桥吧 如有问题,请点击页面左上角“给我写信”发邮件留言!
  • 相关阅读:
    Call KernelIoControl in user space in WINCE6.0
    HOW TO:手工删除OCS在AD中的池和其他属性
    关于新版Windows Server 2003 Administration Tools Pack
    关于SQL2008更新一则
    微软发布3款SQL INJECTION攻击检测工具
    HyperV RTM!
    OCS 2007 聊天记录查看工具 OCSMessage
    CoreConfigurator 图形化的 Server Core 配置管理工具
    OC 2007 ADM 管理模板和Live Meeting 2007 ADM 管理模板发布
    Office Communications Server 2007 R2 即将发布
  • 原文地址:https://www.cnblogs.com/flyoung/p/4919862.html
Copyright © 2011-2022 走看看