欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

详解Android首选项框架的使用实例

程序员文章站 2024-03-01 21:51:28
首选项这个名词对于熟悉android的朋友们一定不会感到陌生,它经常用来设置软件的运行参数。 android提供了一种健壮并且灵活的框架来处理首选项。它提供了简单的a...

首选项这个名词对于熟悉android的朋友们一定不会感到陌生,它经常用来设置软件的运行参数。

android提供了一种健壮并且灵活的框架来处理首选项。它提供了简单的api来隐藏首选项的读取和持久化,并且提供了一个优雅的首选项界面。

首先,我们来看下面这款软件的首选项界面:
详解Android首选项框架的使用实例

这款软件使用了好几种类型的首选项,每一种首选项都有其独特的用法,下面我们来了解一下几种常见的首选项:

  • checkboxpreference:用来打开或关闭某个功能
  • listpreference:用来从多个选项中选择一个值;
  • edittextpreference:用来配置一段文字信息;
  • preference:用来执行相关的自定义操作(上图中的清除缓存、历史记录、表单、cookie都属于此项);
  • ringtonepreference:专门用来为用户设置铃声。

当我们使用首选项框架时,用户每更改一项的值后,系统就会立即在/data/data/[package_name]/shared_prefs下生成一个[package_name]_preferences.xml的文件,文件会记录最新的配置信息。

那么如何使用首选想框架呢?我们需要以下几步操作:

1.建立一个首选项的xml配置文件,放在项目的/res/xml目录下面;

2.新建一个activity,继承android.preference.preferenceactivity,然后在oncreate方法中加载我们的首选项配置文件。

下面,我就为大家演示一下首选项框架的配置和使用:

我们新建一个prefs项目,项目结构如下:
详解Android首选项框架的使用实例

我们要实现的功能跟上面那款软件的很相似,下面我来说明一下这个项目的整体流程:

1.主界面。显示用户昵称,有三个参数,昵称文字、字体大小和背景颜色。首次进入时,使用默认值。

2.按下menu键中的settings项,跳转到首选项页面,进行参数选择。

3.按下返回键,返回主界面,设定后的参数生效。

首先,让我们来看一下主界面的配置文件,非常简单,就一个textview:

<?xml version="1.0" encoding="utf-8"?> 
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:orientation="vertical" 
  android:layout_width="fill_parent" 
  android:layout_height="fill_parent"> 
  <textview 
    android:id="@+id/textview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="center_horizontal" 
    android:textcolor="#ff0000"/> 
</linearlayout> 

然后,我们需要在主界面里根据配置参数设置textview的外观以及背景,mainactivity.java代码如下:

package com.scott.prefs; 
 
import android.app.activity; 
import android.content.context; 
import android.content.intent; 
import android.content.sharedpreferences; 
import android.graphics.color; 
import android.os.bundle; 
import android.view.menu; 
import android.view.menuitem; 
import android.widget.textview; 
 
public class mainactivity extends activity { 
 
  private static final int settings_id = 0; 
  private static final int exit_id = 1; 
 
  private textview textview; 
 
  @override 
  public void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
    setcontentview(r.layout.main); 
    textview = (textview) findviewbyid(r.id.textview); 
    showsettings(); 
  } 
 
  @override 
  public boolean oncreateoptionsmenu(menu menu) { 
    super.oncreateoptionsmenu(menu); 
    menu.add(0, settings_id, 0, "settings"); 
    menu.add(0, exit_id, 0, "quit"); 
    return true; 
  } 
 
  @override 
  public boolean onoptionsitemselected(menuitem item) { 
    if (item.getitemid() == settings_id) { 
      intent intent = new intent(mainactivity.this, prefsactivity.class); 
      //如果requestcode >= 0 则返回结果时会回调 onactivityresult()方法 
      startactivityforresult(intent, 1); 
    } else { 
      finish(); 
    } 
    return true; 
  } 
 
  @override 
  protected void onactivityresult(int requestcode, int resultcode, intent data) { 
    super.onactivityresult(requestcode, resultcode, data); 
    showsettings(); 
  } 
 
  private void showsettings() { 
    string prefsname = getpackagename() + "_preferences";  //[package_name]_preferences 
    sharedpreferences prefs = getsharedpreferences(prefsname, context.mode_private); 
 
    string nickname = prefs.getstring("nickname", "机器人"); 
    textview.settext("欢迎您:" + nickname); 
 
    boolean nightmode = prefs.getboolean("nightmode", false); 
    textview.setbackgroundcolor(nightmode ? color.black : color.white); 
 
    string textsize = prefs.getstring("textsize", "0"); 
    if (textsize.equals("0")) { 
      textview.settextsize(18f); 
    } else if (textsize.equals("1")) { 
      textview.settextsize(22f); 
    } else if (textsize.equals("2")) { 
      textview.settextsize(36f); 
    } 
  } 
} 

可以看到,进入主界面之后会根据[package_name]_preferences获取首选项配置信息,如果是首次进入,则使用默认值,下面就是我们首次进入主界面时的画面:
详解Android首选项框架的使用实例

可以看到,我们初次进入的界面时昵称为“机器人”,字的背景为白色,字的大小为18号。

然后按下settings之后,我们就可以进行首选项的配置了,让我们先来看一下settings.xml的配置:

<?xml version="1.0" encoding="utf-8"?> 
<preferencescreen xmlns:android="http://schemas.android.com/apk/res/android" 
  android:key="settings" 
  android:title="软件设置"> 
  <preferencecategory 
    android:key="basic" 
    android:title="基本设置"> 
    <edittextpreference 
      android:key="nickname" 
      android:title="昵称" 
      android:defaultvalue="机器人"/> 
    <checkboxpreference 
      android:key="nightmode" 
      android:title="夜间模式" 
      android:summaryon="已启用" 
      android:summaryoff="未启用"/> 
    <listpreference 
      android:key="textsize" 
      android:title="文字大小" 
      android:dialogtitle="文字大小" 
      android:entries="@array/textsize_entry" 
      android:entryvalues="@array/textsize_entry_value" 
      android:defaultvalue="0"/> 
  </preferencecategory> 
  <preferencecategory 
    android:key="clean" 
    android:title="清除记录"> 
    <preference  
      android:key="cleanhistory" 
      android:title="清除历史记录" />   
  </preferencecategory> 
</preferencescreen> 

其中,最外层是preferencescreen标签,代表一系列首选项的集合;然后,我们注意到preferencecategory这一项,此标签代表一个类别,可以包含多个首选项;最后就是我们用于配置参数的首选项了。需要了解的是,preferencescreen也可以嵌套使用,也就是说上面的preferencecategory可以替换成preferencescreen。

此外,我们还需要了解一下文件中出现的几个常用标签属性:

  • android:key  选项的名称或键
  • android:title  选项的标题
  • android:summary  选项的简短摘要
  • android:entries  列表项的文本
  • android:entryvalues  列表中每一项的值
  • android:dialogtitle  对话框标题
  • android:defalutvalue  列表中选项的默认值
  • 对于checkboxpreference还有两个特殊的属性
  • android:summaryon  选项被选中时显示的摘要
  • android:summaryoff  选项未选中时显示的摘要

我们还可以看到,在listpreference中,entries来自于textsize_entry,而entryvalues来自于textsize_entry_value,这两项都在/res/values目录下的text_size.xml配置:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
  <string-array name="textsize_entry"> 
    <item>小</item> 
    <item>中</item> 
    <item>大</item> 
  </string-array> 
  <string-array name="textsize_entry_value"> 
    <item>0</item> 
    <item>1</item> 
    <item>2</item> 
  </string-array> 
</resources> 

配置完成之后,我们就剩下最后一步了,创建activity,继承preferenceactivity,加载首选项资源文件,处理相应的选项事件。

prefsactivity.java代码如下:

package com.scott.prefs; 
 
import android.app.alertdialog; 
import android.content.dialoginterface; 
import android.os.bundle; 
import android.preference.edittextpreference; 
import android.preference.listpreference; 
import android.preference.preference; 
import android.preference.preferenceactivity; 
import android.preference.preferencescreen; 
import android.widget.toast; 
 
public class prefsactivity extends preferenceactivity implements preference.onpreferencechangelistener { 
 
  private edittextpreference nickname; 
  private listpreference textsize; 
  private preference cleanhistory; 
 
  @override 
  public void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
    addpreferencesfromresource(r.xml.setttings); 
    nickname = (edittextpreference) findpreference("nickname"); 
    textsize = (listpreference) findpreference("textsize"); 
    cleanhistory = findpreference("cleanhistory"); 
 
    //为nickname和textsize注册preference.onpreferencechangelistener监听事件 
    //当值更改时我们可以立即更新summary 
    nickname.setonpreferencechangelistener(this); 
    textsize.setonpreferencechangelistener(this); 
 
    initsummary(); 
  } 
 
  //初始化summary 
  private void initsummary() { 
    nickname.setsummary(nickname.gettext()); 
 
    settextsizesummary(textsize.getvalue()); 
  } 
 
  private void settextsizesummary(string textsizevalue) { 
    if (textsizevalue.equals("0")) { 
      textsize.setsummary("小"); 
    } else if (textsizevalue.equals("1")) { 
      textsize.setsummary("中"); 
    } else if (textsizevalue.equals("2")) { 
      textsize.setsummary("大"); 
    } 
  } 
 
  /** 
   * 重写preferenceactivity的onpreferencetreeclick方法 
   * 在首选项被点击时 做出相应处理操作 
   */ 
  @override 
  public boolean onpreferencetreeclick(preferencescreen preferencescreen, preference preference) { 
    if (preference == cleanhistory) { 
      new alertdialog.builder(this) 
          .settitle("清除历史记录") 
          .setmessage("是否真的要清除历史记录?") 
          .setpositivebutton("是", new dialoginterface.onclicklistener() { 
            @override 
            public void onclick(dialoginterface dialog, int which) { 
              //cleaning history... 
              toast.maketext(prefsactivity.this, "清除成功", toast.length_short).show(); 
            } 
          }).setnegativebutton("否", new dialoginterface.onclicklistener() { 
        @override 
        public void onclick(dialoginterface dialog, int which) { 
          dialog.dismiss(); 
        } 
      }).create().show(); 
    } 
    return true; 
  } 
 
  /** 
   * 重写preference.onpreferencechangelistener的onpreferencechange方法 
   * 当首选项的值更改时 做出相应处理操作 
   */ 
  @override 
  public boolean onpreferencechange(preference preference, object newvalue) { 
    if (preference == nickname) { 
      nickname.setsummary(newvalue.tostring()); 
    } else if (preference == textsize) { 
      settextsizesummary(newvalue.tostring()); 
    } 
    return true; 
  } 
} 

最后,别忘了在androidmanifest.xml中加入此activity配置信息:

<activity android:name=".prefsactivity"/> 

当然我们也可以配置一下<intent-filter></intent-filter>属性。

经过以上几步,我们的首选项配置就完成了,首次进入的界面如下:详解Android首选项框架的使用实例
然后我们分别更改昵称、夜间模式、文字大小,如下:详解Android首选项框架的使用实例
可以看到,当我们更改了选项的值之后,摘要部分已经设置为最新值了,此时在我们应用下的shared_prefs目录中生成一个com.scott.prefs_preferences.xml文件,如图:详解Android首选项框架的使用实例

内容如下:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?> 
<map> 
  <boolean name="nightmode" value="true" /> 
  <string name="nickname">scott</string> 
  <string name="textsize">2</string> 
</map> 

此时,我们按回退键,回到主界面,发现刚才的设置已经生效了:
详解Android首选项框架的使用实例
可以看到,昵称已经更改成“scott”,字的背景已更改为黑色,字的大小已更改为36号。

如果我们在首选项界面按下清除历史记录一项,将会出现一下界面:详解Android首选项框架的使用实例

原文链接:http://blog.csdn.net/liuhe688/article/details/6448423

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。