詳解Android首選項框架的使用實例
首選項這個名詞對于熟悉Android的朋友們一定不會感到陌生,它經(jīng)常用來設置軟件的運行參數(shù)。
Android提供了一種健壯并且靈活的框架來處理首選項。它提供了簡單的API來隱藏首選項的讀取和持久化,并且提供了一個優(yōu)雅的首選項界面。
首先,我們來看下面這款軟件的首選項界面:

這款軟件使用了好幾種類型的首選項,每一種首選項都有其獨特的用法,下面我們來了解一下幾種常見的首選項:
- CheckBoxPreference:用來打開或關閉某個功能
- ListPreference:用來從多個選項中選擇一個值;
- EditTextPreference:用來配置一段文字信息;
- Preference:用來執(zhí)行相關的自定義操作(上圖中的清除緩存、歷史記錄、表單、cookie都屬于此項);
- RingtonePreference:專門用來為用戶設置鈴聲。
當我們使用首選項框架時,用戶每更改一項的值后,系統(tǒng)就會立即在/data/data/[PACKAGE_NAME]/shared_prefs下生成一個[PACKAGE_NAME]_preferences.xml的文件,文件會記錄最新的配置信息。
那么如何使用首選想框架呢?我們需要以下幾步操作:
1.建立一個首選項的xml配置文件,放在項目的/res/xml目錄下面;
2.新建一個Activity,繼承android.preference.PreferenceActivity,然后在onCreate方法中加載我們的首選項配置文件。
下面,我就為大家演示一下首選項框架的配置和使用:
我們新建一個prefs項目,項目結構如下:

我們要實現(xiàn)的功能跟上面那款軟件的很相似,下面我來說明一下這個項目的整體流程:
1.主界面。顯示用戶昵稱,有三個參數(shù),昵稱文字、字體大小和背景顏色。首次進入時,使用默認值。
2.按下menu鍵中的settings項,跳轉到首選項頁面,進行參數(shù)選擇。
3.按下返回鍵,返回主界面,設定后的參數(shù)生效。
首先,讓我們來看一下主界面的配置文件,非常簡單,就一個TextView:
<?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/textView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
android:textColor="#FF0000"/>
</LinearLayout>
然后,我們需要在主界面里根據(jù)配置參數(shù)設置TextView的外觀以及背景,MainActivity.java代碼如下:
package com.scott.prefs;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
public class MainActivity extends Activity {
private static final int SETTINGS_ID = 0;
private static final int EXIT_ID = 1;
private TextView textView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView = (TextView) findViewById(R.id.textView);
showSettings();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, SETTINGS_ID, 0, "Settings");
menu.add(0, EXIT_ID, 0, "Quit");
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == SETTINGS_ID) {
Intent intent = new Intent(MainActivity.this, PrefsActivity.class);
//如果requestCode >= 0 則返回結果時會回調 onActivityResult()方法
startActivityForResult(intent, 1);
} else {
finish();
}
return true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
showSettings();
}
private void showSettings() {
String prefsName = getPackageName() + "_preferences"; //[PACKAGE_NAME]_preferences
SharedPreferences prefs = getSharedPreferences(prefsName, Context.MODE_PRIVATE);
String nickName = prefs.getString("nickName", "機器人");
textView.setText("歡迎您:" + nickName);
boolean nightMode = prefs.getBoolean("nightMode", false);
textView.setBackgroundColor(nightMode ? Color.BLACK : Color.WHITE);
String textSize = prefs.getString("textSize", "0");
if (textSize.equals("0")) {
textView.setTextSize(18f);
} else if (textSize.equals("1")) {
textView.setTextSize(22f);
} else if (textSize.equals("2")) {
textView.setTextSize(36f);
}
}
}
可以看到,進入主界面之后會根據(jù)[PACKAGE_NAME]_preferences獲取首選項配置信息,如果是首次進入,則使用默認值,下面就是我們首次進入主界面時的畫面:

可以看到,我們初次進入的界面時昵稱為“機器人”,字的背景為白色,字的大小為18號。
然后按下Settings之后,我們就可以進行首選項的配置了,讓我們先來看一下settings.xml的配置:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:key="settings"
android:title="軟件設置">
<PreferenceCategory
android:key="basic"
android:title="基本設置">
<EditTextPreference
android:key="nickName"
android:title="昵稱"
android:defaultValue="機器人"/>
<CheckBoxPreference
android:key="nightMode"
android:title="夜間模式"
android:summaryOn="已啟用"
android:summaryOff="未啟用"/>
<ListPreference
android:key="textSize"
android:title="文字大小"
android:dialogTitle="文字大小"
android:entries="@array/textSize_entry"
android:entryValues="@array/textSize_entry_value"
android:defaultValue="0"/>
</PreferenceCategory>
<PreferenceCategory
android:key="clean"
android:title="清除記錄">
<Preference
android:key="cleanHistory"
android:title="清除歷史記錄" />
</PreferenceCategory>
</PreferenceScreen>
其中,最外層是PreferenceScreen標簽,代表一系列首選項的集合;然后,我們注意到PreferenceCategory這一項,此標簽代表一個類別,可以包含多個首選項;最后就是我們用于配置參數(shù)的首選項了。需要了解的是,PreferenceScreen也可以嵌套使用,也就是說上面的PreferenceCategory可以替換成PreferenceScreen。
此外,我們還需要了解一下文件中出現(xiàn)的幾個常用標簽屬性:
- android:key 選項的名稱或鍵
- android:title 選項的標題
- android:summary 選項的簡短摘要
- android:entries 列表項的文本
- android:entryValues 列表中每一項的值
- android:dialogTitle 對話框標題
- android:defalutValue 列表中選項的默認值
- 對于CheckBoxPreference還有兩個特殊的屬性
- android:summaryOn 選項被選中時顯示的摘要
- android:summaryOff 選項未選中時顯示的摘要
我們還可以看到,在ListPreference中,entries來自于textSize_entry,而entryValues來自于textSize_entry_value,這兩項都在/res/values目錄下的text_size.xml配置:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="textSize_entry">
<item>小</item>
<item>中</item>
<item>大</item>
</string-array>
<string-array name="textSize_entry_value">
<item>0</item>
<item>1</item>
<item>2</item>
</string-array>
</resources>
配置完成之后,我們就剩下最后一步了,創(chuàng)建Activity,繼承PreferenceActivity,加載首選項資源文件,處理相應的選項事件。
PrefsActivity.Java代碼如下:
package com.scott.prefs;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
import android.widget.Toast;
public class PrefsActivity extends PreferenceActivity implements Preference.OnPreferenceChangeListener {
private EditTextPreference nickName;
private ListPreference textSize;
private Preference cleanHistory;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.setttings);
nickName = (EditTextPreference) findPreference("nickName");
textSize = (ListPreference) findPreference("textSize");
cleanHistory = findPreference("cleanHistory");
//為nickName和textSize注冊Preference.OnPreferenceChangeListener監(jiān)聽事件
//當值更改時我們可以立即更新summary
nickName.setOnPreferenceChangeListener(this);
textSize.setOnPreferenceChangeListener(this);
initSummary();
}
//初始化summary
private void initSummary() {
nickName.setSummary(nickName.getText());
setTextSizeSummary(textSize.getValue());
}
private void setTextSizeSummary(String textSizeValue) {
if (textSizeValue.equals("0")) {
textSize.setSummary("小");
} else if (textSizeValue.equals("1")) {
textSize.setSummary("中");
} else if (textSizeValue.equals("2")) {
textSize.setSummary("大");
}
}
/**
* 重寫PreferenceActivity的onPreferenceTreeClick方法
* 在首選項被點擊時 做出相應處理操作
*/
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
if (preference == cleanHistory) {
new AlertDialog.Builder(this)
.setTitle("清除歷史記錄")
.setMessage("是否真的要清除歷史記錄?")
.setPositiveButton("是", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//cleaning history...
Toast.makeText(PrefsActivity.this, "清除成功", Toast.LENGTH_SHORT).show();
}
}).setNegativeButton("否", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).create().show();
}
return true;
}
/**
* 重寫Preference.OnPreferenceChangeListener的onPreferenceChange方法
* 當首選項的值更改時 做出相應處理操作
*/
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (preference == nickName) {
nickName.setSummary(newValue.toString());
} else if (preference == textSize) {
setTextSizeSummary(newValue.toString());
}
return true;
}
}
最后,別忘了在AndroidManifest.xml中加入此Activity配置信息:
<activity android:name=".PrefsActivity"/>
當然我們也可以配置一下<intent-filter></intent-filter>屬性。
經(jīng)過以上幾步,我們的首選項配置就完成了,首次進入的界面如下:
然后我們分別更改昵稱、夜間模式、文字大小,如下:
可以看到,當我們更改了選項的值之后,摘要部分已經(jīng)設置為最新值了,此時在我們應用下的shared_prefs目錄中生成一個com.scott.prefs_preferences.xml文件,如圖:
內容如下:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <boolean name="nightMode" value="true" /> <string name="nickName">scott</string> <string name="textSize">2</string> </map>
此時,我們按回退鍵,回到主界面,發(fā)現(xiàn)剛才的設置已經(jīng)生效了:

可以看到,昵稱已經(jīng)更改成“scott”,字的背景已更改為黑色,字的大小已更改為36號。
如果我們在首選項界面按下清除歷史記錄一項,將會出現(xiàn)一下界面:
原文鏈接:http://blog.csdn.net/liuhe688/article/details/6448423
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- android底部彈出iOS7風格對話選項框(QQ對話框)--第三方開源之IOS_Dialog_Library
- android PopupWindow 和 Activity彈出窗口實現(xiàn)方式
- android 彈出提示框的使用(圖文實例)
- android實現(xiàn)百度地圖自定義彈出窗口功能
- android彈出activity設置大小的方法
- Android實現(xiàn)彈出鍵盤的方法
- android 對話框彈出位置和透明度的設置具體實現(xiàn)方法
- Android實現(xiàn)可輸入數(shù)據(jù)的彈出框
- Android彈出窗口實現(xiàn)方法
- Android百度地圖實現(xiàn)搜索和定位及自定義圖標繪制并點擊時彈出泡泡
- Android實現(xiàn)彈出登陸框的方案
- Android編程單選項框RadioGroup綜合應用示例
- Android編程實現(xiàn)長按彈出選項框View進行操作的方法
相關文章
Android系統(tǒng)的五種數(shù)據(jù)存儲形式實例(一)
Android系統(tǒng)有五種數(shù)據(jù)存儲形式,分別是文件存儲、SP存儲、數(shù)據(jù)庫存儲、contentprovider 內容提供者、網(wǎng)絡存儲。本篇文章詳解的介紹了每種數(shù)據(jù)存儲的用法,有興趣的可以了解一下。2016-12-12
基于Android中dp和px之間進行轉換的實現(xiàn)代碼
本篇文章是對在Android中dp和px之間進行轉換的實現(xiàn)方法進行了分析介紹,需要的朋友參考下2013-05-05
Android使用MediaCodec將攝像頭采集的視頻編碼為h264
這篇文章主要為大家詳細介紹了Android使用MediaCodec將攝像頭采集的視頻編碼為h264,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-10-10
Android之IphoneTreeView帶組指示器的ExpandableListView效果
在正在顯示的最上面的組的標簽位置添加一個和組視圖完全一樣的視圖,作為組標簽。這個標簽的位置要隨著列表的滑動不斷變化,以保持總是顯示在最上方,并且該消失的時候就消失2013-06-06
native.js獲取手機硬件基本信息實例代碼android版
本文為大家分享了native.js獲取手機硬件基本信息實例代碼android版包括手機MAC地址,手機內存大小,手機存儲空間大小,手機CPU信息等手機硬件基本信息2018-09-09
Android編程實現(xiàn)橫豎屏切換時不銷毀當前activity和鎖定屏幕的方法
這篇文章主要介紹了Android編程實現(xiàn)橫豎屏切換時不銷毀當前activity和鎖定屏幕的方法,涉及Android屬性設置及activity操作的相關技巧,需要的朋友可以參考下2015-11-11
Android 使用AsyncTask實現(xiàn)多線程斷點續(xù)傳
本文將詳細講解如何使用AsyncTask來實現(xiàn)多線程的斷點續(xù)傳下載功能,感興趣的朋友跟隨腳本之家小編一起學習吧2018-05-05

