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

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  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中定义:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  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信息呢?

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. public class Setting extends PreferenceActivity implements OnSharedPreferenceChangeListener {  
  2.       
  3.     private EditTextPreference mEtPreference;  
  4.     private ListPreference mListPreference;  
  5.     private CheckBoxPreference mCheckPreference;  
  6.       
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.   
  11.         addPreferencesFromResource(R.xml.preferences);  
  12.         initPreferences();  
  13.     }  
  14.       
  15.     private void initPreferences() {  
  16.         mEtPreference = (EditTextPreference)findPreference(Consts.EDIT_KEY);  
  17.         mListPreference = (ListPreference)findPreference(Consts.LIST_KEY);  
  18.         mCheckPreference = (CheckBoxPreference)findPreference(Consts.CHECKOUT_KEY);  
  19.     }  

 

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


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

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1.    @Override  
  2.    protected void onResume() {  
  3.        super.onResume();  
  4.   
  5.        // Setup the initial values  
  6.        SharedPreferences sharedPreferences = getPreferenceScreen().getSharedPreferences();  
  7.        mListPreference.setSummary(sharedPreferences.getString(Consts.LIST_KEY, ""));  
  8.        mEtPreference.setSummary(sharedPreferences.getString(Consts.EDIT_KEY, "linc"));  
  9.          
  10.        // Set up a listener whenever a key changes  
  11.        sharedPreferences.registerOnSharedPreferenceChangeListener(this);  
  12.    }  
  13.   
  14.    @Override  
  15.    protected void onPause() {  
  16.        super.onPause();  
  17.        // Unregister the listener whenever a key changes  
  18.        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);  
  19.    }      
  20.      
  21. @Override  
  22. public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {  
  23.        if (key.equals(Consts.EDIT_KEY)) {  
  24.         mEtPreference.setSummary(  
  25.                    sharedPreferences.getString(key, "20"));  
  26.        } else if(key.equals(Consts.LIST_KEY)) {  
  27.         mListPreference.setSummary(sharedPreferences.getString(key, ""));  
  28.        }  
  29. }  

 

 

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


看看我的MainActivity:

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


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



本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/4942435.html,如需转载请自行联系原作者

相关文章
|
3月前
|
安全 Android开发 Kotlin
Android经典实战之SurfaceView原理和实践
本文介绍了 `SurfaceView` 这一强大的 UI 组件,尤其适合高性能绘制任务,如视频播放和游戏。文章详细讲解了 `SurfaceView` 的原理、与 `Surface` 类的关系及其实现示例,并强调了使用时需注意的线程安全、生命周期管理和性能优化等问题。
176 8
|
2月前
|
缓存 前端开发 Android开发
Android实战之如何截取Activity或者Fragment的内容?
本文首发于公众号“AntDream”,介绍了如何在Android中截取Activity或Fragment的屏幕内容并保存为图片。包括截取整个Activity、特定控件或区域的方法,以及处理包含RecyclerView的复杂情况。
26 3
|
3月前
|
Android开发 开发者 索引
Android实战经验之如何使用DiffUtil提升RecyclerView的刷新性能
本文介绍如何使用 `DiffUtil` 实现 `RecyclerView` 数据集的高效更新,避免不必要的全局刷新,尤其适用于处理大量数据场景。通过定义 `DiffUtil.Callback`、计算差异并应用到适配器,可以显著提升性能。同时,文章还列举了常见错误及原因,帮助开发者避免陷阱。
261 9
|
3月前
|
开发工具 Android开发 git
Android实战之组件化中如何进行版本控制和依赖管理
本文介绍了 Git Submodules 的功能及其在组件化开发中的应用。Submodules 允许将一个 Git 仓库作为另一个仓库的子目录,有助于保持模块独立、代码重用和版本控制。虽然存在一些缺点,如增加复杂性和初始化时间,但通过最佳实践可以有效利用其优势。
44 3
|
3月前
|
Java Android开发 UED
🧠Android多线程与异步编程实战!告别卡顿,让应用响应如丝般顺滑!🧵
在Android开发中,为应对复杂应用场景和繁重计算任务,多线程与异步编程成为保证UI流畅性的关键。本文将介绍Android中的多线程基础,包括Thread、Handler、Looper、AsyncTask及ExecutorService等,并通过示例代码展示其实用性。AsyncTask适用于简单后台操作,而ExecutorService则能更好地管理复杂并发任务。合理运用这些技术,可显著提升应用性能和用户体验,避免内存泄漏和线程安全问题,确保UI更新顺畅。
121 5
|
2月前
|
Android开发
Android实战之如何快速实现自动轮播图
本文介绍了在 Android 中使用 `ViewPager2` 和自定义适配器实现轮播图的方法,包括添加依赖、布局配置、创建适配器及实现自动轮播等步骤。
87 0
|
2月前
|
Android开发
Android开发显示头部Bar的需求解决方案--Android应用实战
Android开发显示头部Bar的需求解决方案--Android应用实战
24 0
|
3月前
|
编解码 前端开发 Android开发
Android经典实战之TextureView原理和高级用法
本文介绍了 `TextureView` 的原理和特点,包括其硬件加速渲染的优势及与其他视图叠加使用的灵活性,并提供了视频播放和自定义绘制的示例代码。通过合理管理生命周期和资源,`TextureView` 可实现高效流畅的图形和视频渲染。
291 12
|
3月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
165 1
|
3月前
|
Android开发 容器
Android经典实战之如何获取View和ViewGroup的中心点
本文介绍了在Android中如何获取`View`和`ViewGroup`的中心点坐标,包括计算相对坐标和屏幕上的绝对坐标,并提供了示例代码。特别注意在视图未完成测量时可能出现的宽高为0的问题及解决方案。
61 7