Android的配置界面PreferenceActivity

简介:

我想大家对于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可以保存Boolean、Int、Float、Long、String等类型。一般是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);等类方法来获取数据,看能不能获取到



本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/4938641.html,如需转载请自行联系原作者


相关文章
|
1月前
|
编译器 Android开发
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
|
1月前
|
XML 数据可视化 Android开发
Android应用界面
Android应用界面中的布局和控件使用,包括相对布局、线性布局、表格布局、帧布局、扁平化布局等,以及AdapterView及其子类如ListView的使用方法和Adapter接口的应用。
25 0
Android应用界面
|
1月前
|
Java Android开发 Windows
玩转安卓之配置gradle-8.2.1
为安卓开发配置Gradle 8.2.1,包括下载和解压Gradle、配置环境变量、修改配置文件以增加国内镜像,以及在Android Studio中配置Gradle和JDK的过程。
82 0
玩转安卓之配置gradle-8.2.1
|
2月前
|
XML Android开发 UED
💥Android UI设计新风尚!掌握Material Design精髓,让你的界面颜值爆表!🎨
随着移动应用市场的蓬勃发展,用户对界面设计的要求日益提高。为此,掌握由Google推出的Material Design设计语言成为提升应用颜值和用户体验的关键。本文将带你深入了解Material Design的核心原则,如真实感、统一性和创新性,并通过丰富的组件库及示例代码,助你轻松打造美观且一致的应用界面。无论是色彩搭配还是动画效果,Material Design都能为你的Android应用增添无限魅力。
69 1
|
3月前
|
Android开发
Android 配置蓝牙遥控器键值
本文详细介绍了Android系统中配置蓝牙遥控器键值的步骤,包括查看设备号、配置键位映射文件(kl文件)、部署kl文件以及调试过程,确保蓝牙遥控器的按键能正确映射到Android系统对应的按键功能。
151 1
|
3月前
|
搜索推荐 Android开发
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?
本文分享了不同价位电脑配置对于编译AOSP安卓系统源代码的影响,提供了从6000元到更高价位的电脑配置实例,并比较了它们的编译时间,以供学习AOSP源代码时电脑配置选择的参考。
260 0
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?
|
3月前
|
Ubuntu Android开发
安卓系统调试与优化:(一)bootchart 的配置和使用
本文介绍了如何在安卓系统中配置和使用bootchart工具来分析系统启动时间,包括安装工具、设备端启用bootchart、PC端解析数据及分析结果的详细步骤。
197 0
安卓系统调试与优化:(一)bootchart 的配置和使用
|
3月前
|
XML 安全 Android开发
Flutter配置Android和IOS允许http访问
Flutter配置Android和IOS允许http访问
122 3
|
3月前
|
Android开发 iOS开发 C#
Xamarin.Forms:从零开始的快速入门指南——打造你的首个跨平台移动应用,轻松学会用C#和XAML构建iOS与Android通用界面的每一个步骤
【8月更文挑战第31天】Xamarin.Forms 是一个强大的框架,让开发者通过单一共享代码库构建跨平台移动应用,支持 iOS、Android 和 Windows。使用 C# 和 XAML,它简化了多平台开发流程并保持一致的用户体验。本指南通过创建一个简单的 “HelloXamarin” 应用演示了 Xamarin.Forms 的基本功能和工作原理。
87 0
|
3月前
|
监控 安全 API
Android项目架构设计问题之保证线上用户不会进入到本地配置页面如何解决
Android项目架构设计问题之保证线上用户不会进入到本地配置页面如何解决
32 0