一、写作前面

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

对于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. MySQL简单使用

    1.启动MySQL服务器实际上上篇已讲到如何启动MySQL.两种方法:一是用winmysqladmin,如果机器启动时已自动运行,则可直接进入下一步操作.二是在DOS方式下运行 d:/mysql/bi ...

  2. 【转】WPF中Binding的技巧(一)

    WPF中Binding的技巧(一)   在WPF应用的开发过程中Binding是一个非常重要的部分. 在实际开发过程中Binding的不同种写法达到的效果相同但事实是存在很大区别的. 这里将实际中碰到 ...

  3. 12个你未必知道的CSS小知识

    虽然CSS并不是一种很复杂的技术,但就算你是一个使用CSS多年的高手,仍然会有很多CSS用法/属性/属性值你从来没使用过,甚至从来没听说过. 1.CSS的color属性并非只能用于文本显示 对于CSS ...

  4. C#中数据库连接的配置文件

    在C#2010中,如何保存和访问数据库的连接字符串呢? 在Winform下要新增App.config文件,在Asp.net下要新增web.config文件. 1.打开配置文件添加相关代码后如下即可: ...

  5. uva 11992 - Fast Matrix Operations

    简单的线段树的题: 有两种方法写这个题,目前用的熟是这种慢点的: 不过不知道怎么老是T: 感觉网上A过的人的时间度都好小,但他们都是用数组实现的 难道是指针比数组慢? 好吧,以后多用数组写写吧! 超时 ...

  6. Central Europe Regional Contest 2012 Problem I: The Dragon and the Knights

    一个简单的题: 感觉像计算几何,其实并用不到什么计算几何的知识: 方法: 首先对每条边判断一下,看他们能够把平面分成多少份: 然后用边来对点划分集合,首先初始化为一个集合: 最后如果点的集合等于平面的 ...

  7. 练习生产者与消费者-PYTHON多线程中的条件变量同步-Queue

    以前练习过,但好久不用,手生,概念也生了, 重温一下.. URL: http://www.cnblogs.com/holbrook/tag/%E5%A4%9A%E7%BA%BF%E7%A8%8B/ ~ ...

  8. 【HDU 4276】The Ghost Blows Light(树形DP,依赖背包)

    The Ghost Blows Light Problem Description My name is Hu Bayi, robing an ancient tomb in Tibet. The t ...

  9. 【UVA1331】关于最优三角剖分

    最近在练习DP专题,学会了很多表示方法和转换方法,今天做最优三角剖分的时候发现脑子卡了,不会表示状态,于是写个博客记录一下. 最优三角剖分的一类题目都是差不多的.给你一个多边形,让你把它分割成若干个三 ...

  10. 控件构造函数需要的AOwner是TComponent,而不是Parent

    普通控件都只有一个构造函数,但是这个构造函数却强迫指定AOwner,也就是说,VCL希望将所有控件(至少是所有可视化控件)全部置于它的管理之下.至于到底显示不显示,那是另一个层次的问题.这个问题其实挺 ...