`
byandby
  • 浏览: 1697397 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android 探索首选项框架 ListPreference

阅读更多
探索首选项框架
   在深入探讨Android的首选项框架之前,首先构想一个需要使用首选项的场景,然后分析如何实现这一场景。假设你正在编写一个应用程序,它提供了一个搜索飞机航班的工具。而且,假设该应用程序的默认设置是根据机票价格由低到高的顺序显示航班,但用户可以将首选项设置为始终根据最少停站数或特定航线来航班。如果实现这一场景?

ListPreference
   显然,必须为用户提供UI 来查看排序选项列表。该列表将包含每个选项的单选按钮,而且默认(或当前)选项应该被预先选中。要使用Android首选项框架解决此问题,所做的工作非常之少。首先,创建首选项XML文件来描述首选项,然后使用预先构建的活动类,该类知道如何显示和持久化首选项,下面是我们的首选项 XML 文件flightoptions.xml 。
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:key="flight_option_preference"
	android:title="@string/prefTitle"
	android:summary="@string/prefSummary">
	
	<ListPreference
		android:key="@string/selected_flight_sort_option"
		android:title="@string/listTitle"
		android:summary="@string/listSummary"
		android:entries="@array/flight_sort_options"
		android:entryValues="@array/flight_sort_options_values"
		android:dialogTitle="@string/dialogTitle"
		android:defaultValue="@string/flight_sort_option_default_value"/>
</PreferenceScreen>


    上边说了我们还需要一个Activity类FlightPreferenceActivity,下面使我们的Activity类 这个Activity类继承了PreferenceActivity 代码如下:

package xiaohang.zhimeng;

import android.os.Bundle;
import android.preference.PreferenceActivity;

public class FlightPreferenceActivity extends PreferenceActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		addPreferencesFromResource(R.xml.flightoptions);
	}
}


    上面的代码清单 包含了一个表示航班选项示例的首选项设置的XML片段。该包含了一个活动类 也就是我们的 FlightPreferenceActivity 这个类主要用于加载我们的XML 文件。首先看一下XML。Android提供了一种端到端得首选项框架。这意味着,该框架支持定义首选项,想用户显示设置,以及将用户选择持久化到数据库存储中。 在/res/xml/目录下的XML文件中定义首选项。要向用户显示首选项,编写一个活动类来扩展预定义的 Android类 android.preference.PreferenceActivity,然后使用 addPreferencesFromResource()方法将资源添加到活动的资源集合中。该框架会负责剩余操作(现实和持久化)。
     在本航班场景中,在/res/xml/目录下创建文件 flightoptions.xml。然后创建活动类 FlightPreferenceActivity, 它扩展了 android.preference.PreferenceActivity类。接下来调用addPreferencesFromResource() 传入R.xml.flightoptions。请注意,首选项资源XML指向多个字符串资源。为了确保正确编译,需要向项目中添加多个字符串资源 (我们稍后介绍)。现在先看一下 上面得代码清单会生成什么样子的UI.





    上边有两个视图。左边的视图称为首选项屏幕,右边的UI是一个列表首选项。当用户选择 Flight Options时, Choose Flight Options视图将以模态对话框的形式出现,其中包含每个选项的单选按钮。用户选择一个选项之后,将立即该选项并关闭视图。当用户返回选项屏幕时,视图将反映前面保存的选择。

    前面已提到,首选项XML 文件和相关的活动类,从上边我们可以看到 我们在XML文件中定义了一个PreferenceScreen ,然后创建ListPreference作为子屏幕。对于 PreferenceScreen,设置了3个属性: key、title和 summary。 key 是一个字符串,可用于以编程的方式表示项 (类似于使用 android:id的方式);title 是屏幕的标题 (My Preferences) ; summary是对屏幕用途的描述。对于列表首选项,设置 key、title和 summary,以及 entries、entryValues、dialogTitle和defaultValue特性。下表总结了这些特性。

    特性                                说明
android:key                       选项的名称或键(比如selected_flight_sort_option)

android:title                       选项的标题

android:summary               选项的简短摘要

android:entries                  可将选项设置成列表项的文本

android:entryValues          定义每个列表项的值。注意:每个列表项有一些文本和 一 个 值。 文本由entries定义,值由entryValues定义。

android:dialogTitle             对话框的标题,在视图显示为模态对话框时使用
android:defaultValue          项列表中选项的默认值


    为了使我们的例子能够正常运行,我们还需要添加如下文件。

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<string-array name="flight_sort_options">
		<item>Total Cost</item>
		<item># of Stops</item>
		<item>Airline</item>
	</string-array>
	<string-array name="flight_sort_options_values">
		<item>0</item>
		<item>1</item>
		<item>2</item>
	</string-array>
</resources>

    此文件大家一看就知道是 定义我们选项的显示的文本,和 对应的值 这个XML 文件的名字是 arrays.xml 此文件应该放在 /res/values/arrays.xml

   当然不能少了 我们的strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
	<string name="hello">Hello World, FlightPreferenceActivity!</string>
	<string name="app_name">Preference_Demo</string>
	<string name="prefTitle">My Preferences</string>
	<string name="prefSummary">Set Flight Option Preferences</string>
	<string name="flight_sort_option_default_value">1</string>
	<string name="dialogTitle">Choose Flight Options</string>
	<string name="listSummary">Set Search Options</string>
	<string name="listTitle">Flight Options</string>
	<string name="selected_flight_sort_option">selected_flight_sort_option</string>
	<string name="menu_prefs_title">Settings</string>
	<string name="menu_quit_title">Quit</string>
</resources>


   刚才上边说到我们有一个首选项视图,就是那个FlightPreferenceActivity ,在这
这个例子中我们是通过 一个菜单跳转到 我们的首选项视图的。就是 我们有一个 MainActivity 这个 MainActivity有一个菜单 叫 Settings 当我们点击这个菜单的时候就会跳转到我们的首选项视图了,然后我们修改 首选项的内容 当我们再一次回到 MainActivity 的时候就会看到我们修改后的 文本和值,我们通过一个TextView来显示 
我们还是来看一下效果吧。



   下面这个XML文件就是用来定义我们 这个菜单的,此文件的目录在 /res/menu/mainmenu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
	<item android:id="@+id/menu_prefs" android:title="@string/menu_prefs_title" />

	<item android:id="@+id/menu_quit" android:title="@string/menu_quit_title" />
</menu>

也比较 简单了。

在接下来就是我们的 布局文件 main.xml了
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<TextView android:id="@+id/text1" android:layout_width="fill_parent"
		android:layout_height="wrap_content" />
</LinearLayout>

  只有一个TextView 主要用来显示 我们修改首选项之后的 文本 和 值。

    有了main.xml自然少不了 MainActivity了, 下面使我们的 MainActivity类
package xiaohang.zhimeng;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.TextView;

public class MainActivity extends Activity{
	private TextView tv = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		tv = (TextView)findViewById(R.id.text1);
		
		setOptionText();
	}
	//创建菜单,这个菜单我们在XML文件中定义 这里加载进来就OK
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater = getMenuInflater();
		//加载我们的菜单文件
		inflater.inflate(R.menu.mainmenu, menu);
		return true;
	}
	
	//菜单选项事件
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		if (item.getItemId() == R.id.menu_prefs) {
			//当我们点击 Settings 菜单的时候就会跳转到我们的  首选项视图,也就是我们的 FlightPreferenceActivity
			Intent intent = new Intent().setClass(this, xiaohang.zhimeng.FlightPreferenceActivity.class);
			//因为我们要接收上一个Activity 就是我们的首选项视图 返回的数据,所以这里用 startActivityForResult()方法启动我们的首选项视图
			//参数一:我们要跳转到哪里
			//参数二:回传码
			this.startActivityForResult(intent, 0);
		}else if (item.getItemId() == R.id.menu_quit) {
			//当我们点击Quit菜单退出应用程序
			finish();
		}
		return true;
	}
	
	//此方法用来 接收我们上一个Activity 也就是我们的首选项视图 返回的数据,因为我们可能会修改数据
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		setOptionText();
	}     
	//这个方法就是用来设置我们 MainActivity 上的TextView的值(就是我们首选项的值)
	private void setOptionText(){
		/*这个方法比较有意思了
		 * 第一个参数:用来指定我们存储我们首选项值的文件的名称 
		 * 格式就是 包名_preferences,大家可以看到我的包名就是xiaohang.zhimeng
		 * 这里如果你不按照这个格式写 比如你不写你当前包名  写成别的,也会生成 当前包名_preferences 这个文件  写或不写它就在那里
		 * 第二个参数:打开模式
		 * */		
		SharedPreferences prefs = getSharedPreferences("xiaohang.zhimeng_preferences", 0);
		//这个方法大家去看文档,否则我会越写越乱
		String option = prefs.getString(this.getResources().getString(R.string.selected_flight_sort_option), this.getResources().getString(R.string.flight_sort_option_default_value));
		//得到我们首选项 所有选项的文本
		String[] optionText = this.getResources().getStringArray(R.array.flight_sort_options);
		//设置我们 TextView要显示的值
		tv.setText("option value is " + option + "(" + optionText[Integer.parseInt(option)] + ")");
	}
}


  如果大家对这里比较陌生,比如 SharedPreferences 是神马东西,可以参考这 两篇文章。
http://byandby.iteye.com/blog/837601    http://byandby.iteye.com/blog/833292 

    在下边就是我们的AndroidManifest.xml文件了,倒也没啥特别的。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="xiaohang.zhimeng" android:versionCode="1" android:versionName="1.0">
	<uses-sdk android:minSdkVersion="10" />

	<application android:icon="@drawable/icon" android:label="@string/app_name">
		<activity android:name=".MainActivity" android:label="@string/app_name">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>

		<activity android:name=".FlightPreferenceActivity"
			android:label="@string/prefTitle">
			<intent-filter>
				<action android:name="xiaohang.zhimeng.intent.action.FlightPreferences" />
				<category android:name="android.intent.category.PREFERENCE" />
			</intent-filter>
		</activity>
	</application>
</manifest>


    OK,当我们完成了上边的所有 运行应用程序,首先会看到一个简单的文本消息,显示 “option value is 1(# of Stops)”。单击 Menu按钮,然后在点击 Settings,就会打开我们的首选项视图 FlightPreferenceActivity ,然后我们更改首选项的值,然后再点击 back按钮 就会看到我们修改后的值了。

  大家可能会问,那Android把我们修改后的数据存储在哪里了呢?前面已经提到 Android framework还会负责持久化首选项。例如,当用户选择一个排序选项时, Android会选择存储在应用程序 /data 目录下的一个XML 文件中,见下图。

实际的文件路径为 /data/data/[PACKAGE_NAME]/shared_prefs/[PACKAGE_NAME]_preferences.xml。我们需要 看看这个文件里边到底存了些什么? 导出这个文件就可以看到了。哦 不对,不用这样 太麻烦了, 我们 去 shell 里边 用 cat 读一下就行了,见下图。



    一看便知,是以键值对的方式存取,就写到这里了,明天写 CheckBoxPreference,最近IO大会很火热啊,听说 Google 还要让Android控制 家电,害怕中。。。

 
   源码已上传
  • 大小: 13.7 KB
  • 大小: 30.5 KB
  • 大小: 17.2 KB
  • 大小: 19 KB
分享到:
评论
5 楼 杜兰特 2015-08-25  
写的很好,支持
4 楼 rensanning 2012-05-10  
比Pro Android里写的详细!
3 楼 dahual 2012-04-28  
写的很好。学习。
2 楼 Vin-G 2011-06-28  
正在忙着写保存功能,学习了你的方法!改装去。。。
1 楼 gyht0808 2011-05-20  
楼主写的很干净,学习学习

相关推荐

    详解Android首选项框架的使用实例

    Android首选项框架是Android系统提供的一种用于管理应用设置和用户偏好的工具。它允许开发者创建易于使用的设置界面,同时自动处理数据的存储和检索。在本文中,我们将深入探讨如何使用这个框架,通过实例来展示其...

    SimpleCustomListPreference:Android 简单自定义 ListPreference

    在Android中,首选项数据通常存储在SharedPreferences中。我们可以为`SimpleCustomListPreference`添加方法来处理这些操作: ```java // 添加选项 public void addOption(String option) { // 获取现有的选项列表...

    TestPreference修复ListPreference属性无法使用问题

    总之,理解并掌握`Preference`和`ListPreference`在Android开发中的使用是至关重要的,这不仅可以提高应用的用户体验,也是解决这类问题的基础。遇到`ListPreference`属性无法使用的问题时,应按照上述步骤逐步排查...

    第8章--Android的安全性和首选项.pptx

    Android 提供了多种首选项组件,例如 ListPreference、CheckBoxPreference、EditTextPreference、RingtonePreference 等。 8.2.1 首选项的架构 Android 的首选项架构基于 PreferenceScreen 元素,PreferenceScreen...

    Android中Fragmen首选项使用自定义的ListPreference的方法

    在Android开发中,`Fragment` 是一个可重用的UI组件...总之,Android 提供的 `Preference` 框架使得开发者能够轻松管理用户设置,而通过自定义 `Preference` 类,我们可以进一步提升用户体验,使应用更加个性化和专业。

    Android中Preference的使用以及监听事件分析

    Preference类是Android框架的一部分,它简化了UI元素的创建和管理,使得开发者可以方便地实现设置界面。本文将深入探讨Preference的使用方法及其事件监听机制。 一、Preference的种类 Preference家族包括多种类型...

    精通ANDROID 3(中文版)1/2

    9.1 探索首选项框架  9.1.1 ListPreference  9.1.2 CheckBoxPreference  9.1.3 EditTextPreference  9.1.4 RingtonePreference  9.2 组织首选项  9.3 以编程方式操作首选项  9.4 使用首选项保存状态...

    android各种Preference的使用

    总结来说,Android的Preference框架提供了一种方便的方式来实现应用的设置界面,通过XML布局文件和Java代码的配合,可以轻松地创建出具有不同交互方式的设置项。ListPreference是其中的一种,它允许用户在预设的列表...

    Android PrefereceActivity实例

    首先,`Preference`类是Android框架提供的一个接口,用于表示设置项。常见的`Preference`子类有`CheckBoxPreference`、`SwitchPreferenceCompat`、`EditTextPreference`、`ListPreference`等。它们各自对应不同类型...

    Android背景音乐设置代码

    在Android应用开发中,为应用程序添加背景音乐是一个常见的需求,特别是在游戏或者音乐相关的应用中。本教程将深入探讨如何在Android中实现这一功能,重点聚焦于`PreferenceActivity`的使用以及如何选择SD卡上的音乐...

    android网络知识

    Android网络框架的另一个重要部分是Android的Service组件,它可以在后台持续运行,处理长时间的网络任务,避免阻塞UI线程。IntentService是一种特殊的Service,适合执行单一的任务并自动停止服务。除此之外,还可以...

    android Preference Demo

    《Android中的Preference Demo详解》 在Android开发中,Preference是一个重要的组件,用于创建用户界面,让用户可以方便地进行设置和偏好选择。Preference Demo是展示如何使用Preference进行UI设计的一个实例,它...

    Android中preference的使用实例代码

    Preference是Android SDK中的一个类,位于`android.preference`包下,它为应用程序提供了用户设置界面的基础框架。通过继承或扩展Preference,我们可以创建各种类型的偏好设置,如开关按钮(CheckBoxPreference)、...

    精通Android 3 (中文版)2/2

    9.1 探索首选项框架  9.1.1 ListPreference  9.1.2 CheckBoxPreference  9.1.3 EditTextPreference  9.1.4 RingtonePreference  9.2 组织首选项  9.3 以编程方式操作首选项  9.4 使用首选项保存状态...

    android 设置界面 PreferenceScreen

    `PreferenceScreen` 是一个特殊的`Preference`,它作为设置界面的根节点,通常用于在XML布局文件中组织一系列的偏好设置项。通过在XML中定义`&lt;PreferenceScreen&gt;`标签,我们可以添加各种类型的偏好设置,如开关按钮...

    Android之PreferenceActivity简介

    - 在项目中添加一个XML文件作为首选项配置文件。 ##### 步骤2: 添加Preference XML文件 - 使用Eclipse或其他IDE提供的工具,选择“Preference”而不是“Layout”来创建一个新的XML文件。 - 文件应保存在`res/xml/`...

    Android Settings

    Preference有多种类型,如CheckBoxPreference、SwitchPreference、ListPreference等,它们分别对应不同的UI控件和用户交互方式。开发者可以通过继承或使用这些类,快速构建自定义设置界面。 此外,Android Settings...

Global site tag (gtag.js) - Google Analytics