1、寫做前面
當咱們作應用的時候,須要用戶配置一些信息,而這就是一般所說的應用設置。html
對於Android系統來講,系統自己的設置帶來的用戶體驗和習慣已經深刻人心,在咱們的應用中一樣用到相似的設置頁,java
那麼用戶使用起來就會更加親切和方便。是嗎?那咱們應該怎麼作到呢?這就要靠本文的主人公PreferenceActivity了。android
2、設置的細節
打開Android手機的設置,以下圖:數組
![](http://static.javashuo.com/static/loading.gif)
咱們會看到整個頁面被分爲幾組:無線網絡、設備、我的、帳戶和系統。這個分組(或者叫分類)就是PreferenceCategory。網絡
Wifi右邊有開關,這一項就是CheckBoxPreference;其餘還有ListPreference和EditTextPreference。app
你的每一次設置,都會被Preference存下來,這就是setting的數據持久化。ide
3、如何實現本身的設置
下面咱們來實現一個設置程序,看看PreferenceActivity的基本知識都有哪些。字體
首先要說的是,PreferenceActivity從API level1中就加入了,那麼後續自Android3.0後有了Fragment的概念,同時也帶來了PreferenceFragment,這是後話,今天咱們先講講簡單的。this
這個例子有兩個Activity組成,第一個是MainAcitivity,程序啓動後直接到此,用來現實Setting中的各項設置內容;第二個是Setting,繼承自PreferenceActivity,展現如何設置和數據存儲操做等。我只是想演示PreferenceActivity相關的知識,UI是直接託的,layout中也用了Hardcode,請看官只是取其精華(若是有的話),去其糟粕。spa
1.Setting
先來講說重頭戲PreferenceActivity,它並不像普通的Activity那樣用layout來作本身的界面,它是用專屬的xml/preference.xml來構建本身的界面,而後在類中加入此xml。
本例演示三種經常使用preference,以下代碼:
preferenc.xml
[java] view plain copy
![在CODE上查看代碼片](http://static.javashuo.com/static/loading.gif)
![派生到個人代碼片](http://static.javashuo.com/static/loading.gif)
- <?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中定義:
[html] view plain copy
![在CODE上查看代碼片](http://static.javashuo.com/static/loading.gif)
![派生到個人代碼片](http://static.javashuo.com/static/loading.gif)
- <?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信息呢?
[java] view plain copy
![在CODE上查看代碼片](http://static.javashuo.com/static/loading.gif)
![派生到個人代碼片](http://static.javashuo.com/static/loading.gif)
- 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來得到這些值。
下面來看:
[java] view plain copy
![在CODE上查看代碼片](http://static.javashuo.com/static/loading.gif)
![派生到個人代碼片](http://static.javashuo.com/static/loading.gif)
- @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:
[java] view plain copy
![在CODE上查看代碼片](http://static.javashuo.com/static/loading.gif)
![派生到個人代碼片](http://static.javashuo.com/static/loading.gif)
- 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