Android Preference使用


Android Preference經常使用在例如設置的功能,Android提供preference這個鍵值對的方式來處理這種情況,自動保存這些數據,並立時生效,這種就是使用android sharedpreferences方式進行保存的,不需要我們手動來寫,下面的圖片就是使用Preference來進行保存的

 

添加一個簡單的Preference

添加一個Preference很簡單,首先看下圖片

 

我們在res目錄下添加一個xml目錄,里面添加一個itchq文件,這個文件相當於我們的Preference布局文件

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    
    <CheckBoxPreference 
        android:key="checkbox"
        android:title="CheckBoxPreference"
        android:summary="check it box"
        />
    <RingtonePreference
        android:key="ring"
        android:title="ringtone"
        android:summary="check a ringtone"
        />
</PreferenceScreen>

這個就是itchq.xml里面的代碼,這里面的東西往下有介紹。我們再來看看那個Activity里面如何使用的

package com.itchq.itchqpreference;
import com.itchq.itchqpreference.R;

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


public class ItChqActivity extends PreferenceActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.itchq);
    }
    
}

上面的就是Activity的代碼,這個Activity不是繼承Activity這個類的而是PreferenceActivity,其實這個看字面的意思就是Activity的繼承子類,用法和Activity差不多相同的,在Activity中使用setContentView()方法來加載一個布局文件,在這里使用的是addPreferencesFromResource()方法來加載布局文件,既然是Activity就不要忘記在AndroidManifast.xml添加相應的配置,上面的運行結果如下圖

 

  preference 通用的xml 布局屬性

在preference布局文件中,我們可以會經常用到下面的屬性,這些屬性都是preference控件相互通用的。

android:key           這個屬性相當於android:id的作用。用此key來唯一表示此Preference

android:title         Preference的標題,

android:summary       表示Preference提示語,相對於android:title來說顯示要小點,而且顯示位置在android:title下面

android:defaultValue   這個表示的是默認值,比如CheclPreference這種preference就可以指定默認是"true"還是“false”

android:enabled        表示該Preference是否可用狀態

PreferenceScreen

preferenceScreen簡單的說就是所有Preference元素的根節點,我們可以看做是每一個PrederenceActivity布局的開始元素,當然這個PreferenceScreen也可以作為一個組件出現,里面可以嵌套其它組件,那么這個將會以另外的一屏顯示出來,就是當我們點擊后出現一個新的屏幕

 

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    
    <CheckBoxPreference 
        android:key="checkbox"
        android:title="CheckBoxPreference"
        android:summary="check it box"
        />
    <RingtonePreference
        android:key="ring"
        android:title="ringtone"
        android:summary="check a ringtone"
        />
    <PreferenceScreen 
        android:key="screen"
        android:title="PreferenceScreen"
        android:summary="screen it"
        >
        <SwitchPreference
            android:key="switch"
            android:title="switchPreference"
            android:summary="switch it"
            />
        <EditTextPreference
            android:key="edit"
            android:title="editPreference"
            android:summary="OK"
            />
    </PreferenceScreen>
</PreferenceScreen>

 

如上面的代碼里面有一個PreferenceScreen,這個PreferenceScreen里面嵌套了SwitchPreference和EditTextPreference,android:key相當android:id,我們到時候通過這個在Activity中找到對應的組件,android:title就是標題,android:summary就是這個一個提示語,這三個屬性都是最基本的信息,看下圖:

上面圖片中最后一項就是我們添加的,“PreferenceScreen”就是我們的android:title,“screen it”就是這個android:summary,那么當我們點擊這個選項時就會跳轉到一個新的頁面,頁面顯示如下圖:

這個就是上面的在PreferenceScreen中嵌套的兩個組件,SwitchPreference和EditTextPreference

 

PreferenceCategory

PreferenceCategory 這個控件類似於LinearLayou、RelativeLayout,用於組合一組Preference,使布局看起來具有層次關系,美觀

 

    <PreferenceCategory 
        android:key="category"
        android:title="PreferenceCategory"
        >
         <EditTextPreference
            android:key="edit"
            android:title="category"
            android:summary="OK"
            />
    </PreferenceCategory>

 

 

如上圖中Category前面有一天很大的線,這個就是使用了PreferenceCategory效果。

Preference這個控件這里簡單介紹一下,這個就和我們的TextView是一樣的,就是顯示一個文本

 

ListPreference

ListPreference這個就是顯示一個相當的list,先看下面的代碼

 

    <ListPreference 
        android:key="list"
        android:title="Options"
        android:entries="@array/entry_list"                    
        android:entryValues="@array/values_list"
        android:dialogTitle="list dialogtitle"
        android:defaultValue="1"
        />

 

我們可以看到在這個代碼中android:entries屬性表示的就是這個listView對話框控件欲顯示的文本,android:entryValues與文本相對應的key-value鍵值對,value保存至sharedPreference文件,而我們的entries和entryValue屬性使用的數組定義在資源文件arrays.xml的數組名,我們來看看arrays.xml文件的定義

<resources>
    
    <string-array name="entry_list">
        <item>total</item>
        <item>check</item>
        <item>airplace</item>
    </string-array>
    <string-array name="values_list">
        <item>0</item>
        <item>1</item>
        <item>2</item>
    </string-array>
</resources>

這個就是arrays.xml文件的定義,android:dialogTitle是指這個list彈出框的文本,android:defauleValues表示在缺省條件下顯示哪個值,這個值對應的是values_list的值,我們先來看看效果

如圖這個Options就是我們要ListPreference,當我們點擊這個之后顯示效果如下圖:

 

看到了把,我們的這個dialog形式來顯示listView的,默認android:defaultValues=“1”就是對應第二個"check",這個標題就是android:dialogTitle設置的

CheckBoxPreference

checkBoxPreference這個相當於checkBox,是一個多選,先看代碼

 

    <CheckBoxPreference 
        android:key="checkbox_one"
        android:title="checbox_one"
        android:summaryOn="On_check_one"
        android:summaryOff="offcheck_one"
        />
    <CheckBoxPreference
        android:key="checkbox_two"
        android:summaryOff="offcheck_two"
        android:summaryOn="On_check_two"
        android:title="checbox_two" />
    <CheckBoxPreference
        android:key="checkbox_three"
        android:summaryOff="offcheck_three"
        android:summaryOn="On_check_three"
        android:title="checbox_three" />

android:summaryOn和android:summaryOff表示在選擇和不選擇分別顯示的summary,運行效果圖如下:

 

當我們選擇checkbox_one是下面的offcheck_one提示就會修改為On_check_one

EditTextPreference

等同於EditText,相關的代碼顯示如下:

 

    <EditTextPreference android:key="edit"
       android:title="Set Package Name"
        android:summary="Set the Package Name"
        android:dialogTitle="Package Name:" /> 

 

當我們點擊下面的“Set Package Name“的時候就會彈出這么一個文本對話框,”Package Name“就是這個android:dialogTitle的屬性

RingtonePreference

這個是一個鈴聲選項的功能,用得比較少不做介紹

MultiSelectListPreference

它的實現和ListPreference相似,不同的是還可以不選擇或者多個選擇,代碼是和ListPreference一樣的,運行效果如下圖:

從上面一些基本的Preference控件已經差不多介紹完了,下面再來介紹一個有關於點擊和存儲的功能使用

首先來介紹一下如何在我們的PreferenceActivity中找到我們的控件,我們在Activity是通過findViewById()來找到我們指定的控件的,那么在PreferenceActivity中我們可以使用findPreference這個方法來找到指定的方法,用法如下:

        mCheck=(CheckBoxPreference) findPreference("checkbox");
        mRing=(RingtonePreference) findPreference("ring");

findPreference里面的參數就是我們使用android:key所定義的,這個應該容易理解。

在PreferenceActivity方法中,一個比較重要的監聽點擊事件方法為

 

    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
            Preference preference) {
        // TODO Auto-generated method stub
        
        return true;
    }

 

參數 preference   表示的是點擊的對象,在我們繼承PreferenceActivity可以重寫該方法,來完成我們對Preference事件的捕捉,用法如下

    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
            Preference preference) {
        // TODO Auto-generated method stub
        if(preference.getKey().equals("checkbox")){
            Log.i("itchq", "checkbox");
        }
        return true;
    }

除了上面這個監聽的方法之外,還有兩個重要的接口:

OnPreferenceChangeListener

當Preference的元素值發送改變時,觸發該事件,記住只有元素值改變才會觸發這個值,返回值為true 表示將新值寫入sharedPreference文件中

false 則不將新值寫入sharedPreference文件

 

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        // TODO Auto-generated method stub
        return false;
    }

 

OnPreferenceClickListener

當點擊控件時觸發發生,可以做相應操作

    @Override
    public boolean onPreferenceClick(Preference preference) {
        // TODO Auto-generated method stub
        return false;
    }

 

那么這三個點擊事件在一起是什么用的呢?它的規則如下:

點擊某個Preference控件后,會先回調onPreferenceChange()方法,即是否保存值(這個下面會講解這個值是如何保存的),然后再回調onPreferenceClick以及onPreferenceTreeClick()方法,因此在onPreferenceClick/onPreferenceTreeClick方法中我們得到的控件值就是最新的Preference控件值。然后onPreferenceClick會比onPreferenceTreeClick()方法先調用,如果onPreferenceClick方法返回true,那就不會再調用onPreferenceTreeClick()方法,如果onPreferenceClick()返回false就會繼續調用onPreferenceTreeClick()方法

數據的保存

前面我們說過,Android系統會將Preference元素的值存儲在sharedPreference文件中。該文件存放路徑位於 DDMS視圖下的data/data/[packgename]/shared_prefs/文件下,命名約定為:packagename_preferencse.xml 如下圖:

 

那么我們要如何去獲取這些已經保存的數據呢?首先我們要通過xml中的key獲取數值,就是Preference控件中android:key所對應的屬性(已一個鍵值對的形式保存,name為Preference的key值,value為Preference的value值)讀取方法如下:

         SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ;
         Log.i("itchq", "checbox="+prefs.getBoolean("checkbox",false));

我們通過getDefaultSharedPreferences()方法來讀取的,”checkbox“就是我們CheckBoxPreference所定義的android:key屬性值這樣是不是很方便,我們都不需要手動取保存這個對應的值,只要直接去取就可以了。preference的數值會被保留,而且可以在其他的 activity中讀取。如果需要清除數據,可以通過remove()清除某個名字的prefernece,clear()清除所有的 preferences。我們可以通過edit()獲取preferences的editor,進而進行編輯,修改后,通過commit()將修改值保存。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM