当前位置:   article > 正文

详解Android首选项框架的使用_app:summaryon=

app:summaryon=

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

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

首先,我们来看下面这款软件的首选项界面:

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

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项目,项目结构如下:

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

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

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

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

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent">
  6. <TextView
  7. android:id="@+id/textView"
  8. android:layout_width="fill_parent"
  9. android:layout_height="fill_parent"
  10. android:gravity="center_horizontal"
  11. android:textColor="#FF0000"/>
  12. </LinearLayout>
然后,我们需要在主界面里根据配置参数设置TextView的外观以及背景,MainActivity.java代码如下:

  1. package com.scott.prefs;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.content.SharedPreferences;
  6. import android.graphics.Color;
  7. import android.os.Bundle;
  8. import android.view.Menu;
  9. import android.view.MenuItem;
  10. import android.widget.TextView;
  11. public class MainActivity extends Activity {
  12. private static final int SETTINGS_ID = 0;
  13. private static final int EXIT_ID = 1;
  14. private TextView textView;
  15. @Override
  16. public void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.main);
  19. textView = (TextView) findViewById(R.id.textView);
  20. showSettings();
  21. }
  22. @Override
  23. public boolean onCreateOptionsMenu(Menu menu) {
  24. super.onCreateOptionsMenu(menu);
  25. menu.add(0, SETTINGS_ID, 0, "Settings");
  26. menu.add(0, EXIT_ID, 0, "Quit");
  27. return true;
  28. }
  29. @Override
  30. public boolean onOptionsItemSelected(MenuItem item) {
  31. if (item.getItemId() == SETTINGS_ID) {
  32. Intent intent = new Intent(MainActivity.this, PrefsActivity.class);
  33. //如果requestCode >= 0 则返回结果时会回调 onActivityResult()方法
  34. startActivityForResult(intent, 1);
  35. } else {
  36. finish();
  37. }
  38. return true;
  39. }
  40. @Override
  41. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  42. super.onActivityResult(requestCode, resultCode, data);
  43. showSettings();
  44. }
  45. private void showSettings() {
  46. String prefsName = getPackageName() + "_preferences"; //[PACKAGE_NAME]_preferences
  47. SharedPreferences prefs = getSharedPreferences(prefsName, Context.MODE_PRIVATE);
  48. String nickName = prefs.getString("nickName", "机器人");
  49. textView.setText("欢迎您:" + nickName);
  50. boolean nightMode = prefs.getBoolean("nightMode", false);
  51. textView.setBackgroundColor(nightMode ? Color.BLACK : Color.WHITE);
  52. String textSize = prefs.getString("textSize", "0");
  53. if (textSize.equals("0")) {
  54. textView.setTextSize(18f);
  55. } else if (textSize.equals("1")) {
  56. textView.setTextSize(22f);
  57. } else if (textSize.equals("2")) {
  58. textView.setTextSize(36f);
  59. }
  60. }
  61. }
可以看到,进入主界面之后会根据[PACKAGE_NAME]_preferences获取首选项配置信息,如果是首次进入,则使用默认值,下面就是我们首次进入主界面时的画面:

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

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:key="settings"
  4. android:title="软件设置">
  5. <PreferenceCategory
  6. android:key="basic"
  7. android:title="基本设置">
  8. <EditTextPreference
  9. android:key="nickName"
  10. android:title="昵称"
  11. android:defaultValue="机器人"/>
  12. <CheckBoxPreference
  13. android:key="nightMode"
  14. android:title="夜间模式"
  15. android:summaryOn="已启用"
  16. android:summaryOff="未启用"/>
  17. <ListPreference
  18. android:key="textSize"
  19. android:title="文字大小"
  20. android:dialogTitle="文字大小"
  21. android:entries="@array/textSize_entry"
  22. android:entryValues="@array/textSize_entry_value"
  23. android:defaultValue="0"/>
  24. </PreferenceCategory>
  25. <PreferenceCategory
  26. android:key="clean"
  27. android:title="清除记录">
  28. <Preference
  29. android:key="cleanHistory"
  30. android:title="清除历史记录" />
  31. </PreferenceCategory>
  32. </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配置:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <string-array name="textSize_entry">
  4. <item></item>
  5. <item></item>
  6. <item></item>
  7. </string-array>
  8. <string-array name="textSize_entry_value">
  9. <item>0</item>
  10. <item>1</item>
  11. <item>2</item>
  12. </string-array>
  13. </resources>
配置完成之后,我们就剩下最后一步了,创建Activity,继承PreferenceActivity,加载首选项资源文件,处理相应的选项事件。

PrefsActivity.java代码如下:

  1. package com.scott.prefs;
  2. import android.app.AlertDialog;
  3. import android.content.DialogInterface;
  4. import android.os.Bundle;
  5. import android.preference.EditTextPreference;
  6. import android.preference.ListPreference;
  7. import android.preference.Preference;
  8. import android.preference.PreferenceActivity;
  9. import android.preference.PreferenceScreen;
  10. import android.widget.Toast;
  11. public class PrefsActivity extends PreferenceActivity implements Preference.OnPreferenceChangeListener {
  12. private EditTextPreference nickName;
  13. private ListPreference textSize;
  14. private Preference cleanHistory;
  15. @Override
  16. public void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. addPreferencesFromResource(R.xml.setttings);
  19. nickName = (EditTextPreference) findPreference("nickName");
  20. textSize = (ListPreference) findPreference("textSize");
  21. cleanHistory = findPreference("cleanHistory");
  22. //为nickName和textSize注册Preference.OnPreferenceChangeListener监听事件
  23. //当值更改时我们可以立即更新summary
  24. nickName.setOnPreferenceChangeListener(this);
  25. textSize.setOnPreferenceChangeListener(this);
  26. initSummary();
  27. }
  28. //初始化summary
  29. private void initSummary() {
  30. nickName.setSummary(nickName.getText());
  31. setTextSizeSummary(textSize.getValue());
  32. }
  33. private void setTextSizeSummary(String textSizeValue) {
  34. if (textSizeValue.equals("0")) {
  35. textSize.setSummary("小");
  36. } else if (textSizeValue.equals("1")) {
  37. textSize.setSummary("中");
  38. } else if (textSizeValue.equals("2")) {
  39. textSize.setSummary("大");
  40. }
  41. }
  42. /**
  43. * 重写PreferenceActivity的onPreferenceTreeClick方法
  44. * 在首选项被点击时 做出相应处理操作
  45. */
  46. @Override
  47. public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
  48. if (preference == cleanHistory) {
  49. new AlertDialog.Builder(this)
  50. .setTitle("清除历史记录")
  51. .setMessage("是否真的要清除历史记录?")
  52. .setPositiveButton("是", new DialogInterface.OnClickListener() {
  53. @Override
  54. public void onClick(DialogInterface dialog, int which) {
  55. //cleaning history...
  56. Toast.makeText(PrefsActivity.this, "清除成功", Toast.LENGTH_SHORT).show();
  57. }
  58. }).setNegativeButton("否", new DialogInterface.OnClickListener() {
  59. @Override
  60. public void onClick(DialogInterface dialog, int which) {
  61. dialog.dismiss();
  62. }
  63. }).create().show();
  64. }
  65. return true;
  66. }
  67. /**
  68. * 重写Preference.OnPreferenceChangeListener的onPreferenceChange方法
  69. * 当首选项的值更改时 做出相应处理操作
  70. */
  71. @Override
  72. public boolean onPreferenceChange(Preference preference, Object newValue) {
  73. if (preference == nickName) {
  74. nickName.setSummary(newValue.toString());
  75. } else if (preference == textSize) {
  76. setTextSizeSummary(newValue.toString());
  77. }
  78. return true;
  79. }
  80. }
最后,别忘了在AndroidManifest.xml中加入此Activity配置信息:

<activity android:name=".PrefsActivity"/>
当然我们也可以配置一下<intent-filter></intent-filter>属性。

经过以上几步,我们的首选项配置就完成了,首次进入的界面如下:

然后我们分别更改昵称、夜间模式、文字大小,如下:

可以看到,当我们更改了选项的值之后,摘要部分已经设置为最新值了,此时在我们应用下的shared_prefs目录中生成一个com.scott.prefs_preferences.xml文件,如图:

内容如下:

  1. <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
  2. <map>
  3. <boolean name="nightMode" value="true" />
  4. <string name="nickName">scott</string>
  5. <string name="textSize">2</string>
  6. </map>
此时,我们按回退键,回到主界面,发现刚才的设置已经生效了:

可以看到,昵称已经更改成“scott”,字的背景已更改为黑色,字的大小已更改为36号。

如果我们在首选项界面按下清除历史记录一项,将会出现一下界面:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/332986
推荐阅读
相关标签
  

闽ICP备14008679号