Android學習筆記(四十):Preference的使用

來源:互聯網
上載者:User

標籤:des   android   style   class   blog   code   

Preference直譯為偏好,博友建議翻譯為喜好設定。一些配置資料,一些我們上次點擊選擇的內容,我們希望在下次應用調起的時候依舊有效,無須使用者再一次進行配置或選擇。Android提供preference這個鍵值對的方式來處理這樣的情況,自己主動儲存這些資料,並立時生效,同一時候Android提供一種類似的layout的方式來進行Prefernce的布局。

一個簡單的Preferenece範例

步驟1:編寫preference XML,在res/xml/下增加我們的preference XML檔案,比如名字叫c21preference.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- preference的組織方式有PreferenceScreen和PreferenceCategory,PreferenceCategory是帶層次組織關係,在後面的範例體驗,而PreferenceScreen就是最平白和基礎的方式 -->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 有四個基本組建,這個範例學習兩個。裡面的內容對比圖,非常easy理解,RingtonePreference是選擇鈴音,這裡給出兩個選擇,系統預設的鈴音和無聲 -->
    <CheckBoxPreference android:key="checkbox"
        android:title="CheckBox Preference"
        android:summary="Check it on , check it off"/>
    <RingtonePreference android:key="ringtone"
        android:title="Ringtone Preference"
        android:showDefault="true"
        android:showSilent="true"
        android:summary="Pick a tone, any tone"/>
</PreferenceScreen>

步驟2:在java源碼中調用該xml,產生對應的preference介面

public class Chapter21Test1 extendsPreferenceActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.c21preference);
    }
}

和用layout方式一樣,代碼非常easy。和以往介面最大的差別是,我們對checkbox進行選擇或者對ringtone進行選擇後,這個選擇結果是被保留的,當我們退出actitvity後再次進入,上次的選項依舊保留,我們又一次向模擬器load應用,發現之前的選項仍然存在。我們能夠利用preference,而無須人工對資料進行儲存和讀取,非常是方便。

步驟3:擷取preference的資料

處了在preference的介面中可以保留資料,我們也希望可以讀出資料,以便這些資料可以用在其它的activity中。假設還有一個activity和這些資料關聯,並且希望可以即時進行同步,在onResume()中對preference保留的資料進行讀取,而後進行相關的更新。

首先要擷取preferences,然後通過鍵值對的擷取方式依據key擷取數值,在xml中checkbox的key為“checkbox”,值的類型為布爾值,而rintong的值為String,比如:

    protected void onResume() { //在還有一個Activity中
        super.onResume();
        SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ;
        System.out.println(new Boolean(prefs.getBoolean("checkbox",false)).toString());//false表示沒有查到checkbox這個key的返回值
        System.out.println(prefs.getString("ringtone","<unset>"));//<unset>表示沒有查到ringtong這個key的返回值
    }

擷取preferences能夠通過三種方式:
一、getPreferences():能夠擷取同一activity中的preference;
二、getSharedPreferences():能夠擷取映用層級的preferences(),在這個範例中因為我們封裝在同一app中,也能夠使用SharePreferences prefs = getSharedPreferences( "com.wei.android.learning_preferences" ,0);當中第一個參數name的格式是<package_name>_preferences;
三、getDefaultSharedPreferences():就是我們範例的方式,通過Android的偏好管理器來擷取其所管理的preferences。

Preferenece資料的操作

在上面的範例中,preference的數值會被保留,並且能夠在其它的activity中讀取。假設須要清除資料,能夠通過remove()清除某個名字的prefernece,clear()清除全部的preferences。我們能夠通過edit()擷取preferences的editor,進而進行編輯,改動後,通過commit()將改動值儲存。

Preferenece XML

Preference的XML能夠通過PreferenceCategory來進行組織。PreferenceCategory能夠將幾個組建組合在一起,並加上標題。我們依舊用前面的xml範例,通過PreferenceCategory來進行組織,例如以下:和之前的範例比較,將chekcbox和rintong組織成為一個category,並加上了"simple Preferences"的標題。

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
       <PreferenceCategory android:title="Simple Preferences">
            <CheckBoxPreference android:key="checkbox" ..../>
            <RingtonePreference android:key="ringtone" ... />
       </PreferenceCategory>
</PreferenceScreen>

PreferenceCategory也能夠嵌套PreferenceScreen,PreferenceScreen中的內容,將通過還有一屏來顯示,我們在上面範例後面加入一個嵌套了PreferenceScreen的PreferenceCategory。整個PreferenceScreen作為一個組件出現,點擊後新的一屏,由入PreferenceScreen定義。通過這個關係,我們能夠組織自己的preference架構。

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
       <PreferenceCategory android:title="Simple Preferences">
            <CheckBoxPreference android:key="checkbox" ..../>
            <RingtonePreference android:key="ringtone" ... />
       </PreferenceCategory>
       <PreferenceCategory android:title="Detail Screens">
           <PreferenceScreen android:title="Detail"
               android:summary="Addtional preference help in another page">
               <CheckBoxPreference android:key="checkbox2"
                   android:title="Another Checkbox"
                   android:summary="On or Off, It‘s a problem...."/>
           </PreferenceScreen>
       </PreferenceCategory>
</PreferenceScreen>

在前面的範例中我們使用了CheckBox和Ringtong,在以下的範例,我們實驗另外的兩個組建EditText和List,這兩種都是已彈框的方式。在上面的範例我們繼續新增內容

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen ...>
       ......     
       <PreferenceCategory android:title="Other Preferences">
           <EditTextPreference android:key="text"
               android:title="Text Entry Dialog"
               android:summary="Click to pop up a field for entry"
               android:dialogTitle="Enter something useful"/>
           <ListPreference android:key="list"
               android:title="Selection Dialog"
               android:summary="Click to pop yo a list for select"
               android:entries="@array/cities"
               android:entryValues="@array/airport_codes"

               android:dialogTitle="Choose a City"/>
       </PreferenceCategory>
</PreferenceScreen>

在list中由兩個引用@array/cities和@array/airport_codes,我們在資源檔裡定義此兩array。內容例如以下:
<resource>
     <string-array>
        <item>Pittsburgh</item>
        <item>Allentown/Bethlehem</item>
        <item>Erie</item>
        ... ...
    </string-array>
    <string-array name="airport_codes">
        <item>PHL</item>
        <item>PIT</item>
        <item>ABE</item>
        ... ...
    </string-array>
</resources>

執行結果如右圖所看到的。對於EditText,鍵值對儲存的值是String,即使用者在輸入框中輸入的內容。List的情況略微複雜一些,在設定ListPreference的屬性有一個entires,這是在List顯示給使用者看的內容,假設我們去擷取preference的值,在這個範例為prefs.getString("list", "<unset>");,則返回在entryValues相應的數值,比如我們選擇了第一個item:Pittsburgh,則擷取的值為PHL。entries和entryValues是一一相應的。

相關連結: 我的Android開發相關文章

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.