Android实战技巧之六:PreferenceActivity使用详解
一、写作前面
当我们做应用的时候,需要用户配置一些信息,而这就是通常所说的应用设置。
对于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
- <?xml version="1.0" encoding="utf-8"?>
- <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
- <PreferenceCategory android:title="First Category">
- <ListPreference
- android:key="list_key"
- android:defaultValue="list key default value"
- android:title="list title"
- android:summary="list_summary"
- android:entries="@array/list_preference"
- android:entryValues="@array/list_preference"
- android:dialogTitle="list_dialog_title" />
- </PreferenceCategory>
- <PreferenceCategory android:title="Second Category">
- <EditTextPreference
- android:key="edittext_key"
- android:defaultValue="edit default value"
- android:summary="edit summary"
- android:title="edit title" />
- <CheckBoxPreference
- android:key="checkbox_key"
- android:defaultValue="checkbox default value"
- android:summary="checkbox summary"
- android:title="checkbox title"
- />
- <EditTextPreference
- android:key="num_key"
- android:defaultValue="0"
- android:summary="edit summary"
- android:numeric="integer"
- android:title="input number" />
- </PreferenceCategory></PreferenceScreen>
我将这三项preference分成两组(PreferenceCategory),First Category和Second Category.
每一个Preference中的都会包含一个key(android:key),它的功能相当于普通layout中的id。
title:这一项的标题,字体比较大。
summary:摘要,标题下面的文字,字体较小。
defaultValue:为设置summary之前的默认值。
其中数组list_preference在array.xml中定义:
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string-array name="list_preference">
- <item>Red</item>
- <item>Blue</item>
- <item>Green</item>
- </string-array>
- </resources>
Setting中是怎样加入这些UI信息呢?
- public class Setting extends PreferenceActivity implements OnSharedPreferenceChangeListener {
- private EditTextPreference mEtPreference;
- private ListPreference mListPreference;
- private CheckBoxPreference mCheckPreference;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- addPreferencesFromResource(R.xml.preferences);
- initPreferences();
- }
- private void initPreferences() {
- mEtPreference = (EditTextPreference)findPreference(Consts.EDIT_KEY);
- mListPreference = (ListPreference)findPreference(Consts.LIST_KEY);
- mCheckPreference = (CheckBoxPreference)findPreference(Consts.CHECKOUT_KEY);
- }
此时,这个setting类就可以运行起来了。其实就是这么简单。也许你会问,我们设置了自己的偏好值,程序中如何获得呢?
我们需要注册一个Preference变化的Listener来监听这些事件。当我们做好设置后,Preference已经替我们做好了数据持久化了。
我们可以用sharedPreference来获得这些值。
下面来看:
- @Override
- protected void onResume() {
- super.onResume();
- // Setup the initial values
- SharedPreferences sharedPreferences = getPreferenceScreen().getSharedPreferences();
- mListPreference.setSummary(sharedPreferences.getString(Consts.LIST_KEY, ""));
- mEtPreference.setSummary(sharedPreferences.getString(Consts.EDIT_KEY, "linc"));
- // Set up a listener whenever a key changes
- sharedPreferences.registerOnSharedPreferenceChangeListener(this);
- }
- @Override
- protected void onPause() {
- super.onPause();
- // Unregister the listener whenever a key changes
- getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
- }
- @Override
- public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
- if (key.equals(Consts.EDIT_KEY)) {
- mEtPreference.setSummary(
- sharedPreferences.getString(key, "20"));
- } else if(key.equals(Consts.LIST_KEY)) {
- mListPreference.setSummary(sharedPreferences.getString(key, ""));
- }
- }
到此,setting的功能就实现了。那么,在其他Activity中如何获得设置的值呢?也是用sharedPreference来实现:
看看我的MainActivity:
- package com.linc.howtopreferenceactivity;
- import android.os.Bundle;
- import android.preference.PreferenceManager;
- import android.app.Activity;
- import android.content.Intent;
- import android.content.SharedPreferences;
- import android.view.Menu;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.TextView;
- public class MainActivity extends Activity {
- private Button btnSetting,btnShow;
- private TextView tvCheckout,tvList,tvEditText;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- initView();
- }
- private void initView() {
- btnSetting = (Button)findViewById(R.id.btn_setting);
- btnShow = (Button)findViewById(R.id.btn_show);
- btnSetting.setOnClickListener(buttonListener);
- btnShow.setOnClickListener(buttonListener);
- tvCheckout = (TextView)findViewById(R.id.tv_checkout);
- tvList = (TextView)findViewById(R.id.tv_list);
- tvEditText = (TextView)findViewById(R.id.tv_edittext);
- }
- private OnClickListener buttonListener = new OnClickListener() {
- @Override
- public void onClick(View v) {
- switch(v.getId()) {
- case R.id.btn_setting:
- startActivity(new Intent(MainActivity.this,Setting.class));
- break;
- case R.id.btn_show:
- showSettingInfo();
- break;
- }
- }
- };
- private void showSettingInfo() {
- SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
- tvCheckout.setText(settings.getBoolean(Consts.CHECKOUT_KEY, false)+"");
- tvEditText.setText(settings.getString(Consts.EDIT_KEY, ""));
- tvList.setText(settings.getString(Consts.LIST_KEY, "linc"));
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- }
当然,就像用edit text一样,我们可以限制输入的是文字还是数字或者是字母。就像上面代码:android:numeric="integer"
完整代码在此:HowToPreferenceActivity
Android实战技巧之六:PreferenceActivity使用详解的更多相关文章
- Android实战技巧:深入解析AsyncTask
AsyncTask的介绍及基本使用方法 关于AsyncTask的介绍和基本使用方法可以参考官方文档和Android实战技巧:多线程AsyncTask这里就不重复. AsyncTask引发的一个问题 上 ...
- JavaScript调试技巧之console.log()详解
JavaScript调试技巧之console.log()详解 对于JavaScript程序的调试,相比于alert(),使用console.log()是一种更好的方式,原因在于:alert()函数会阻 ...
- Android EventBus 3.0 实例使用详解
EventBus的使用和原理在网上有很多的博客了,其中泓洋大哥和启舰写的非常非常棒,我也是跟着他们的博客学会的EventBus,因为是第一次接触并使用EventBus,所以我写的更多是如何使用,源码解 ...
- Android开发:文本控件详解——TextView(一)基本属性
一.简单实例: 新建的Android项目初始自带的Hello World!其实就是一个TextView. 在activity_main.xml中可以新建TextView,从左侧组件里拖拽到右侧预览界面 ...
- [置顶]
xamarin android toolbar(踩坑完全入门详解)
网上关于toolbar的教程有很多,很多新手,在使用toolbar的时候踩坑实在太多了,不好好总结一下,实在浪费.如果你想学习toolbar,你肯定会去去搜索androd toolbar,既然你能看到 ...
- 最佳实战Docker持续集成图文详解
最佳实战Docker持续集成图文详解 这是一种真正的容器级的实现,这个带来的好处,不仅仅是效率的提升,更是一种变革:开发人员第一次真正为自己的代码负责——终于可以跳过运维和测试部门,自主维护运行环境( ...
- 《FPGA设计技巧与案例开发详解-第二版》全套资料包
本人参与写的一本书(TimeQuest一章由我所写),希望大家多多支持: 全书配套资料上传各大网盘资料中附送大量源码,你值得拥有--<FPGA设计技巧与案例开发详解-第二版>全套资料包-V ...
- Android 应用程序之间内容分享详解(二)
转载请注明出处:http://blog.csdn.net/xiaanming/article/details/9428613 Android 应用程序之间内容分享详解(一) 之前给大家分享了你开发的应 ...
- Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)
[Android布局学习系列] 1.Android 布局学习之——Layout(布局)详解一 2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数) 3.And ...
随机推荐
- FFMPEG视音频编解码零基础学习方法-b
感谢大神分享,虽然现在还看不懂,留着大家一起看啦 PS:有不少人不清楚“FFmpeg”应该怎么读.它读作“ef ef em peg” 0. 背景知识 本章主要介绍一下FFMPEG都用在了哪里(在这里仅 ...
- UIVIewController自定义切换效果-b
之前介绍动画时提过UIView的转场动画,但是开发中我们碰到更多的viewController的切换,ios中常见的viewcontroller切换有四种:模态视图,导航栏控制器,UITabBar ...
- DM8168 解码显示模块代码阅读分析
解码/显示概述:从共享文件夹获取H264流,对264流进行解析,生成hdr文件,hdr文件中包含每一帧的信息,将视频帧信息存放在A8核分配的共享内存空间,供其他核或其他的link调用,M3 Video ...
- 通过本地加载ga.js文件提高Google Anlytics性能
Google Anlytics 分析代码是异步加载的,一般来讲不会影响网页性能,但是技术部的网页性能报告里老是提到ga.js的状态为Aborted,说明ga虽然是异步跟踪,但某些情况下对网页性能与加载 ...
- POJ 2992 Divisors
每个数都可以分解成素数的乘积: 写成指数形式:n=p1^e1*p2^e2*...*pn^en:(p都是素数) 那么n的因数的数量m=(e1+1)*(e2+1)*...*(en+1): 所以用筛选法筛出 ...
- cisco telnet会话SESSION管理及相关Dynagen配置文件
#Lab 2-5 autostart = False [localhost] [[2621]] ram = 64 image = C:\Program Files (x86)\Dynamips\ima ...
- Android 获取系统短信内容
//这里通过内容提供者获取系统短信内容 Uri uri = Uri.parse("content://sms/"); String[] projection = {"_i ...
- 使用HttpClient向服务器发送restful post请求
直接上代码: public class RestClient { public static void main(String[] args) { String url = "http:// ...
- 解读30个提高Web程序执行效率的好经验
其实微博是个好东西,关注一些技术博主之后,你不用再逛好多论坛了,因为一些很好的文章微博会告诉你,最近看到酷勤网推荐的一篇文章<30个提高Web程序执行效率的好经验>,文章写得不错,提到一些 ...
- 监控持有sql和被堵塞的sql
Session 1: mysql> start transaction; Query OK, 0 rows affected (0.00 sec) mysql> update Client ...