一、写作前面

当我们做应用的时候,需要用户配置一些信息,而这就是通常所说的应用设置。

对于Android系统来说,系统本身的设置带来的用户体验和习惯已经深入人心,在我们的应用中同样用到类似的设置页,

那么用户使用起来就会更加亲切和方便。是吗?那我们应该怎么做到呢?这就要靠本文的主人公PreferenceActivity了。

二、设置的细节

打开Android手机的设置,如下图:

我们会看到整个页面被分为几组:无线网络、设备、个人、账户和系统。这个分组(或者叫分类)就是PreferenceCategory。

Wifi右边有开关,这一项就是CheckBoxPreference;其他还有ListPreference和EditTextPreference。

你的每一次设置,都会被Preference存下来,这就是setting的数据持久化。

三、如何实现自己的设置

下面我们来实现一个设置程序,看看PreferenceActivity的基本知识都有哪些。

首先要说的是,PreferenceActivity从API level1中就加入了,那么后续自Android3.0后有了Fragment的概念,同时也带来了PreferenceFragment,这是后话,今天我们先讲讲简单的。

这个例子有两个Activity组成,第一个是MainAcitivity,程序启动后直接到此,用来现实Setting中的各项设置内容;第二个是Setting,继承自PreferenceActivity,展示如何设置和数据存储操作等。我只是想演示PreferenceActivity相关的知识,UI是直接托的,layout中也用了Hardcode,请看官只是取其精华(如果有的话),去其糟粕。

1.Setting

先来说说重头戏PreferenceActivity,它并不像普通的Activity那样用layout来做自己的界面,它是用专属的xml/preference.xml来构建自己的界面,然后在类中加入此xml。

本例演示三种常用preference,如下代码:

preferenc.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
  3. <PreferenceCategory android:title="First Category">
  4. <ListPreference
  5. android:key="list_key"
  6. android:defaultValue="list key default value"
  7. android:title="list title"
  8. android:summary="list_summary"
  9. android:entries="@array/list_preference"
  10. android:entryValues="@array/list_preference"
  11. android:dialogTitle="list_dialog_title" />
  12. </PreferenceCategory>
  13. <PreferenceCategory android:title="Second Category">
  14. <EditTextPreference
  15. android:key="edittext_key"
  16. android:defaultValue="edit default value"
  17. android:summary="edit summary"
  18. android:title="edit title" />
  19. <CheckBoxPreference
  20. android:key="checkbox_key"
  21. android:defaultValue="checkbox default value"
  22. android:summary="checkbox summary"
  23. android:title="checkbox title"
  24. />
  25. <EditTextPreference
  26. android:key="num_key"
  27. android:defaultValue="0"
  28. android:summary="edit summary"
  29. android:numeric="integer"
  30. android:title="input number" />
  31. </PreferenceCategory></PreferenceScreen>

我将这三项preference分成两组(PreferenceCategory),First Category和Second Category.

每一个Preference中的都会包含一个key(android:key),它的功能相当于普通layout中的id。
title:这一项的标题,字体比较大。

summary:摘要,标题下面的文字,字体较小。
defaultValue:为设置summary之前的默认值。

其中数组list_preference在array.xml中定义:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <string-array name="list_preference">
  4. <item>Red</item>
  5. <item>Blue</item>
  6. <item>Green</item>
  7. </string-array>
  8. </resources>

Setting中是怎样加入这些UI信息呢?

  1. public class Setting extends PreferenceActivity implements OnSharedPreferenceChangeListener {
  2. private EditTextPreference mEtPreference;
  3. private ListPreference mListPreference;
  4. private CheckBoxPreference mCheckPreference;
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. addPreferencesFromResource(R.xml.preferences);
  9. initPreferences();
  10. }
  11. private void initPreferences() {
  12. mEtPreference = (EditTextPreference)findPreference(Consts.EDIT_KEY);
  13. mListPreference = (ListPreference)findPreference(Consts.LIST_KEY);
  14. mCheckPreference = (CheckBoxPreference)findPreference(Consts.CHECKOUT_KEY);
  15. }

此时,这个setting类就可以运行起来了。其实就是这么简单。也许你会问,我们设置了自己的偏好值,程序中如何获得呢?

我们需要注册一个Preference变化的Listener来监听这些事件。当我们做好设置后,Preference已经替我们做好了数据持久化了。
我们可以用sharedPreference来获得这些值。
下面来看:

  1. @Override
  2. protected void onResume() {
  3. super.onResume();
  4. // Setup the initial values
  5. SharedPreferences sharedPreferences = getPreferenceScreen().getSharedPreferences();
  6. mListPreference.setSummary(sharedPreferences.getString(Consts.LIST_KEY, ""));
  7. mEtPreference.setSummary(sharedPreferences.getString(Consts.EDIT_KEY, "linc"));
  8. // Set up a listener whenever a key changes
  9. sharedPreferences.registerOnSharedPreferenceChangeListener(this);
  10. }
  11. @Override
  12. protected void onPause() {
  13. super.onPause();
  14. // Unregister the listener whenever a key changes
  15. getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
  16. }
  17. @Override
  18. public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
  19. if (key.equals(Consts.EDIT_KEY)) {
  20. mEtPreference.setSummary(
  21. sharedPreferences.getString(key, "20"));
  22. } else if(key.equals(Consts.LIST_KEY)) {
  23. mListPreference.setSummary(sharedPreferences.getString(key, ""));
  24. }
  25. }

到此,setting的功能就实现了。那么,在其他Activity中如何获得设置的值呢?也是用sharedPreference来实现:

看看我的MainActivity:

  1. package com.linc.howtopreferenceactivity;
  2. import android.os.Bundle;
  3. import android.preference.PreferenceManager;
  4. import android.app.Activity;
  5. import android.content.Intent;
  6. import android.content.SharedPreferences;
  7. import android.view.Menu;
  8. import android.view.View;
  9. import android.view.View.OnClickListener;
  10. import android.widget.Button;
  11. import android.widget.TextView;
  12. public class MainActivity extends Activity {
  13. private Button btnSetting,btnShow;
  14. private TextView tvCheckout,tvList,tvEditText;
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_main);
  19. initView();
  20. }
  21. private void initView() {
  22. btnSetting = (Button)findViewById(R.id.btn_setting);
  23. btnShow = (Button)findViewById(R.id.btn_show);
  24. btnSetting.setOnClickListener(buttonListener);
  25. btnShow.setOnClickListener(buttonListener);
  26. tvCheckout = (TextView)findViewById(R.id.tv_checkout);
  27. tvList = (TextView)findViewById(R.id.tv_list);
  28. tvEditText = (TextView)findViewById(R.id.tv_edittext);
  29. }
  30. private OnClickListener buttonListener = new OnClickListener() {
  31. @Override
  32. public void onClick(View v) {
  33. switch(v.getId()) {
  34. case R.id.btn_setting:
  35. startActivity(new Intent(MainActivity.this,Setting.class));
  36. break;
  37. case R.id.btn_show:
  38. showSettingInfo();
  39. break;
  40. }
  41. }
  42. };
  43. private void showSettingInfo() {
  44. SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
  45. tvCheckout.setText(settings.getBoolean(Consts.CHECKOUT_KEY, false)+"");
  46. tvEditText.setText(settings.getString(Consts.EDIT_KEY, ""));
  47. tvList.setText(settings.getString(Consts.LIST_KEY, "linc"));
  48. }
  49. @Override
  50. public boolean onCreateOptionsMenu(Menu menu) {
  51. // Inflate the menu; this adds items to the action bar if it is present.
  52. getMenuInflater().inflate(R.menu.main, menu);
  53. return true;
  54. }
  55. }

当然,就像用edit text一样,我们可以限制输入的是文字还是数字或者是字母。就像上面代码:android:numeric="integer"

完整代码在此:HowToPreferenceActivity

Android实战技巧之六:PreferenceActivity使用详解的更多相关文章

  1. Android实战技巧:深入解析AsyncTask

    AsyncTask的介绍及基本使用方法 关于AsyncTask的介绍和基本使用方法可以参考官方文档和Android实战技巧:多线程AsyncTask这里就不重复. AsyncTask引发的一个问题 上 ...

  2. JavaScript调试技巧之console.log()详解

    JavaScript调试技巧之console.log()详解 对于JavaScript程序的调试,相比于alert(),使用console.log()是一种更好的方式,原因在于:alert()函数会阻 ...

  3. Android EventBus 3.0 实例使用详解

    EventBus的使用和原理在网上有很多的博客了,其中泓洋大哥和启舰写的非常非常棒,我也是跟着他们的博客学会的EventBus,因为是第一次接触并使用EventBus,所以我写的更多是如何使用,源码解 ...

  4. Android开发:文本控件详解——TextView(一)基本属性

    一.简单实例: 新建的Android项目初始自带的Hello World!其实就是一个TextView. 在activity_main.xml中可以新建TextView,从左侧组件里拖拽到右侧预览界面 ...

  5. [置顶] xamarin android toolbar(踩坑完全入门详解)

    网上关于toolbar的教程有很多,很多新手,在使用toolbar的时候踩坑实在太多了,不好好总结一下,实在浪费.如果你想学习toolbar,你肯定会去去搜索androd toolbar,既然你能看到 ...

  6. 最佳实战Docker持续集成图文详解

    最佳实战Docker持续集成图文详解 这是一种真正的容器级的实现,这个带来的好处,不仅仅是效率的提升,更是一种变革:开发人员第一次真正为自己的代码负责——终于可以跳过运维和测试部门,自主维护运行环境( ...

  7. 《FPGA设计技巧与案例开发详解-第二版》全套资料包

    本人参与写的一本书(TimeQuest一章由我所写),希望大家多多支持: 全书配套资料上传各大网盘资料中附送大量源码,你值得拥有--<FPGA设计技巧与案例开发详解-第二版>全套资料包-V ...

  8. Android 应用程序之间内容分享详解(二)

    转载请注明出处:http://blog.csdn.net/xiaanming/article/details/9428613 Android 应用程序之间内容分享详解(一) 之前给大家分享了你开发的应 ...

  9. Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)

    [Android布局学习系列]   1.Android 布局学习之——Layout(布局)详解一   2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)   3.And ...

随机推荐

  1. C# RichTextBox 获取当前显示部分的文字

    int start = richTextBox1.GetCharIndexFromPosition(new Point(0, 0)); int end = richTextBox1.GetCharIn ...

  2. Java多线程初学者指南(4):线程的生命周期

    与人有生老病死一样,线程也同样要经历开始(等待).运行.挂起和停止四种不同的状态.这四种状态都可以通过Thread类中的方法进行控制.下面给出了Thread类中和这四种状态相关的方法. // 开始线程 ...

  3. Matlab中Rand()函数用法

    一.理论准备 matlab函数randn:产生均值为0,方差 σ^2 = 1,标准差σ = 1的正态分布的随机数或矩阵的函数. 用法:Y = randn(n),返回一个n*n的随机项的矩阵.如果n不是 ...

  4. AJAX里调用AJAX,作定时进度刷新

    这个确实搞了一段时间,但成就感有啦... 哈哈,这个自动部署平吧,异步队列CELERY+REDIS,发布进度实时AJAX的技术点全部打通!!! 而获取实时进度,我用的是RESTFUL FRAMEWOR ...

  5. 【HDU 4436】 str2int (广义SAM)

    str2int Problem Description In this problem, you are given several strings that contain only digits ...

  6. Android Training精要(一)ActionBar上级菜单导航图标

    Navigation Up(ActionBar中的上级菜单导航图标) 在android 4.0中,我们需要自己维护activity之间的父子关系. 导航图标ID为android.R.id.home @ ...

  7. 【HDOJ】2844 Coins

    完全背包. #include <stdio.h> #include <string.h> ], c[]; int n, m; ]; int mymax(int a, int b ...

  8. USACO3.32Shopping Offers(DP)

    五维DP,听着挺多的,貌似就是挺裸的dp, 最近貌似做简单的DP挺顺手..1A dp[i][j][e][o][g] = min(dp[i][j][e][o][g],dp[i-i1][j-i2][e-i ...

  9. 简单的单页c#生成静态页源码

    protected void BtGroup_ServerClick(object sender, EventArgs e)        {            //产业群首页           ...

  10. POJ_3045_Cow_Acrobats_(贪心)

    描述 http://poj.org/problem?id=3045 n头牛,每头牛都有重量w[i]和力量s[i].把这n头牛落起来,每头牛会有一个危险值,危险值是它上面所有牛的重量和减去它的力量.求危 ...