PreferenceActivity相關細節

1、寫做前面

當咱們作應用的時候,須要用戶配置一些信息,而這就是一般所說的應用設置。html

對於Android系統來講,系統自己的設置帶來的用戶體驗和習慣已經深刻人心,在咱們的應用中一樣用到相似的設置頁,java

那麼用戶使用起來就會更加親切和方便。是嗎?那咱們應該怎麼作到呢?這就要靠本文的主人公PreferenceActivity了。android

2、設置的細節

打開Android手機的設置,以下圖:數組

咱們會看到整個頁面被分爲幾組:無線網絡、設備、我的、帳戶和系統。這個分組(或者叫分類)就是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上查看代碼片派生到個人代碼片

  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"


完整代碼在此:HowToPreferenceActivity

相關文章
相關標籤/搜索