1. 程式人生 > >Pro Android學習筆記 五七 Preferences 1 ListPreference

Pro Android學習筆記 五七 Preferences 1 ListPreference

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

Adnroid提供Preferences framework,使用者可定製化應用,可用來儲存資訊和狀態。在Android學習筆記(四十):Preference的使用中我已經對preferences有所瞭解。在Android 3.0,隨著對平板的支出,preferences有不少的變化。

例子1:ListPreference小例子

我們先同一個簡單的例子來複習。機票的顯示預設是按最低價格,但是使用者可以選擇自己希望的排序方式,並設為預設排序。在這個例子中,使用API level 11之前的方法,在實現方面會更為簡單,主要是為了更好了解什麼是preference。Android提供的完整的prefrences framework,包括通過xml定義、顯示設定,可保留使用者選擇項。

例子執行如圖,左圖稱為preference screen為定製設定的選項,點選,展開右圖,是一個list preference,以帶有radio button的對話方塊方式呈現,當用戶選擇某個配置,將馬上被儲存,並關閉對話方塊,使用者重新開啟,即時是activity關閉後重新開啟,也可得到之前定製配置。例子的實現分為兩個步驟:

1、定義一個preferences XML檔案

res/xml下,我們定義名為fightoptions.xml的檔案,如下。合理的屬性值應該採用@string/xxxx的方式,但是為了很好的例子對應,我們直接賦值。

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    android:key="flight_option_preference"   按:

可以通過key來獲取preference,類似於view的android:id 
    android:title="My Preferences"                 按:對於最top的PreferenceScreen,此為Activity的title
    android:summary="設定航線排序選項">
    <ListPreference android:key="selected_flight_sort_option"   按:可以通過key來獲取preference
        android:title="Flight Options"              
        android:summary="Set Search Options"
        android:entries="@array/flight_sort_options"                    按:list的內容
        android:entryValues="@array/flight_sort_options_values" 按:list各內容對應的value
        android:dialogTitle="Choose Flight Options"
        android:defaultValue="1"/>  <!-- 對應為entryValues的值,預設1,即預設為Number of Stops。 -->
</PreferenceScreen>

其中有兩個資料,我們在res/values/array.xml檔案中定義,具體如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="flight_sort_options">
        <item>Total Cost</item>
        <item>Number of Stops</item>
        <item>AirLine</item>
    </string-array>
    <string-array name="flight_sort_options_values">
        <item>0</item>
        <item>1</item>
        <item>2</item>
    </string-array>
</resources>

這兩個陣列,分別是list preference的entries和entry value,前者是用於顯示給使用者,後者是用於在裝置中儲存。本例選取了陣列的需要做為entry value。通過android:defatulvalue設定預設的entry value,如果我們不設定,則取值為null,這顯然是不合適。

Preferences儲存在裝置的/data/data/<package-name>/shared_prefs/<package-name>_preferences.xml檔案中,可通過DDMS的檔案瀏覽器檢視(對於真實裝置,該檔案不能讀,模擬器上的可以)。

我們通過DDMS的檔案瀏覽器將其匯出,如下:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="selected_flight_sort_option">1</string>
</map>

儲存了list preferences的key和使用者選擇的entry value。分開entry和entry value是有意義的,開發者可以重新定義entry的描述,或者增加陣列的長度,只要維持原有entry value不變,升級後preference仍然有效。一般,我們會在res/vaule/中設定string的值,方便適應不同語言版本,但是要注意key的值不應該有多個。

2、繼承PreferenceActivity

public class FightListPreferenceActivity extends PreferenceActivity{ 
    @SuppressWarnings("deprecation")
    @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        // 將xml定義載入為preferences
        addPreferencesFromResource(R.xml.fightoptions);
         
        // 以下僅用於瞭解xml各屬性的含義,並讀取屬性
        Preference p = findPreference("flight_option_preference"); //通過key來獲取preference
        showInfo("p = " + p);
        showInfo("summary: " + p.getSummary());
        showInfo("title: " + p.getTitle()); 
        
        ListPreference lp = (ListPreference)findPreference("selected_flight_sort_option");
        showInfo("lp = " + lp);
        showInfo("entry = " + lp.getEntry());
        showInfo("value = " + lp.getValue());         
    }
   
    private void showInfo(String s){
        Log.d(getLocalClassName(),s);
    }

}

3、使用者定製偏好的讀取

使用者設定了preferences,應用的其他activity可以讀取,應用關閉後,重新啟動也能讀取相應的配置。在MainActivity中通過OptionsMenu觸發FightListPreferenceActivity,我們在MainActivity中提供讀取preferences的方法,如下:

private void getPreferenceCfg(){ 
     //通過preferences管理器獲取本應用的preferences。引數this將使用本package的名字來尋找儲存檔案。  
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    //根據preferences 的key獲取entity value,並給出預設值。由於應用第一次執行時,沒有儲存的preference檔案,如果不使用預設值,則返回null。在這裡,我們直接指定預設值為“1”,這只是為了例子簡單的便捷方式。實際上,我們應該在res/values/下設定我們的預設值,除了可在preference的xml中引用,還可以直接在此設定預設值。同一個值不要在多處進行賦值是程式設計的基本原則之一。  
    String option = prefs.getString("
selected_flight_sort_option", "1"); 
    //通過entity value獲取entity的內容
    String[] optionText = getResources().getStringArray(R.array.flight_sort_options); 
    showInfo("option = " + option + ",select : " + optionText[Integer.parseInt(option)]);

}

另一個獲取share prefs的方式如下,第一個引數是幫助查詢儲存檔案,一般可以用應用的報名,第二個引數是mode。可以通過這種方式獲取其他應用的preferences。本例,預設模式為MODE_PRIVATE,對於模擬器,儲存檔案的讀寫許可權比較高,即使在MODE_PRIVATE模式下,跨應用可以讀取。一般我們不使用這種方式,但是如果在同一裝置上,有多個使用者,可以採用第二種方式,區分開不同使用者的定製的偏好,但就目前很少有這種情況。

SharedPreferences prefs = getSharedPreferences("cn.wei.flowingflying.propreferences", 0);

     第一次執行時設定預設值

如果設定項很多,每項在程式碼中都設定預設值,推薦的方式如下。在應用第一次執行時,從preference的xml中獲取預設值,並生成儲存檔案,如果已經有一個SharedPrefferences物件,也會進行更新之,即下面程式碼中頭L3和L4可以互換。即時getString中將預設值設定為null,也會根據配置讀到預設值。非第一執行,不會改動現有儲存值。

protected void onCreate(Bundle savedInstanceState) {
    … …
    PreferenceManager.setDefaultValues(this, R.xml.fightoptions, false);
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    String option = prefs.getString("selected_flight_sort_option",null); 
    showInfo("option = " + option );
}

執行setDefaultValues()後,即時沒有執行PreferenceActivity,系統會根據預設配置,生成儲存檔案,如下圖。此外還有_has_set_default_values.xml用於表明是通過預設值建立的。setDefaultValues()的第三個引數,我的試驗是在Android 4.4的版本中,無論true或者false,並不會有什麼影響,設定true,並不會在已有儲存檔案的情況下,將其重置為預設值。

另一個獲取share prefs的方式如下,第一個引數是幫助查詢儲存檔案,一般可以用應用的報名,第二個引數是mode。可以通過這種方式獲取其他應用的preferences。本例,預設模式為MODE_PRIVATE,對於模擬器,儲存檔案的讀寫許可權比較高,即使在MODE_PRIVATE模式下,跨應用可以讀取。一般我們不使用這種方式,但是如果在同一裝置上,有多個使用者,可以採用第二種方式,區分開不同使用者的定製的偏好,但就目前很少有這種情況。

SharedPreferences prefs = getSharedPreferences("cn.wei.flowingflying.propreferences", 0);

4、設定Category

Preference可被其他應用獲取,PreferenceActivity也可被intent喚起,我們可以設定activity的型別,例如:

<activity android:name=".FightListPreferenceActivity" android:label="@string/test_list_preferences" >
    <intent-filter>
        <action android:name="cn.wei.flowingflying.propreferences.intent.action.FightPreferences" />

        <category android:name="android.intent.category.PREFERENCE"/>
    </intent-filter>
</activity>

本博文涉及的例子程式碼,可以在Pro Android學習:Preference(首選項)小例子中下載。

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

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述