閱讀161 返回首頁    go 阿裏雲 go 技術社區[雲棲]


PreferenceActivity 用法2

 

為了引入這個概率 首先從需求說起 即:現有某Activity專門用於手機屬性設置 那麼應該如何做呢?

 

根據已學知識 很快一個念頭閃過 即:Activity + Preference 組合 前者用於界麵構建 後者用於設置數據存放  其實 這是正確的 但是 這會比較繁瑣 因為 每個設置選項 都要建立與其對應的Preference

 

所以  現在有更好的選擇了 那就是本文的主角:PreferenceActivity

 

 

從名字應該可以看出 其實 Activity 與 Perference 的混合物

 

 

 

 

還是從需求說起  常見屬性設定  有哪幾種方式:

 

1. CheckBox  用於 確定/取消  某項功能    如:是否靜音   對應於:CheckBoxPreference   其在Preference 有一個選項與其自動綁定 下同

 

 

2.  ListView 用於列出所有選擇  如:鈴聲選擇 列出所有聲音供選擇使用  對應於:ListPreference

 

 

3.  屬性結合 用於列出一係列相關屬性 如:所有與短消息有關的功能 對應於:PreferenceScreen  該項僅用於界麵 故與Preference無關

 

 

 

界麵 其實 討論這個 比較雞肋 大家自己試著運行就一目了然了  所以 覺得還是以步驟為主

 

 

鑒於PreferenceActivity使用 網絡很多 故此略過 為了給自己備份 防止以後用到 大致敘述一下

 

[代碼 步驟]

 

1.  PreferenceActivity  界麵比較特別 在 res/xml/setting.xml

 

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
 xmlns:androhttps://schemas.android.com/apk/res/android">https://schemas.android.com/apk/res/android">
  <CheckBoxPreference
            android:key="autoBack"
            android:title="自動回複"
            android:summaryOn="開啟"
            android:summaryOff="關閉"
            android:defaultValue="true"
        />
       
    <PreferenceCategory android:title="SMS 助手">
     <CheckBoxPreference
                android:key="smsSilence"
                android:title="靜音"
                android:summaryOn="開啟"
                android:summaryOff="關閉"
                android:defaultValue="false"
            />
        <PreferenceScreen android:title="更多選項">
            <CheckBoxPreference
                android:key="cb21"
                android:title="功能1"
                android:summaryOn="開啟"
                android:summaryOff="關閉"
                android:defaultValue="true"
            />
            <CheckBoxPreference
                android:key="cb22"
                android:title="功能2"
                android:summaryOn="使用"
                android:summaryOff="停用"
                android:defaultValue="true"
            />
        <ListPreference
         android:key="list1"
         android:title="android forum"
         android:summary="開發論壇"
         android:dialogTitle="請選擇論壇"
         android:entries="@array/entries_list_preference"
         android:entryValues="@array/entriesvalue_list_preference"
     />
     <EditTextPreference
        android:key="et1"
        android:title="EditTextPreference Sample"
        android:summary="點擊輸入"
        android:dialogTitle="輸入設置"
        android:defaultValue="Hello EditTextPreference"
     />
        </PreferenceScreen>
    </PreferenceCategory>
   
    <PreferenceCategory android:title="其他選項">
    <RingtonePreference
        android:key="rt1"
        android:title="RingtonePreference Sample"
        android:summary="選擇鈴聲"
    />
    </PreferenceCategory>
</PreferenceScreen>

 

2. 導入setting.xml

 

addPreferencesFromResource(R.xml.settings);

  emulator 運行截圖:

 

 

點開"更多選項"

 

 

 

 

具體 請大家自己嚐試之

 

 

 

3. 其實 關於PreferenceActivity 問題 基本結束了 但是 初次使用 會碰到一些坎坷 現一一討論

 

 

4. 監聽設定變化問題    普通布局裏的監聽  比較簡單 先通過findViewById()獲得目標View  再在其上注冊監聽器即可

 

但是 PreferenceActivity 並沒有提供findViewById()  也就無法監聽 那麼 怎麼做呢?  

 

- 得到SharedPreferences 句柄

 

sp = PreferenceManager.getDefaultSharedPreferences(this);

- 在 sp 之上注冊改變監聽器

 

sp.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener(){

    @Override
    //sharedPreferences:句柄
    //key: 改變 鍵值
    public void onSharedPreferenceChanged(
      SharedPreferences sharedPreferences, String key) {
     // TODO Auto-generated method stub
             
              if(key.equals("autoBack")){
               Boolean autoBack = sharedPreferences.getBoolean("autoBack", false);
               if(autoBack){
                Log.d("TAG","autoBack: true!");
               }
               else {
                Log.d("TAG","autoBack: false!");
               }
              }
    }
             
            });

 

 

5. Preference 異地使用 即:PreferenceActivity 在一個應用程序 而別處應用程序可能也想改變該數據   怎麼做呢?

 

- 通過getSharedPreferences()  得到SharedPreferences實例

 

spc = this.getSharedPreferences("com.android.PreferenceActivity.Usage_preferences.xml", MODE_WORLD_READABLE );

- 取值

 

Boolean autoBack = spc.getBoolean("autoBack", false);

- 賦值

 

public void putValue(String key, Boolean value){
     spe = spc.edit();
     spe.putBoolean(key, value);
     spe.commit();
 }

 

 

就這樣結束 似乎感覺不爽 所以決定加點料

 

 

- ListPreference 使用

 

<ListPreference
         android:key="list1"
         android:title="android forum"
         android:summary="開發論壇"
         android:dialogTitle="請選擇論壇"
         android:entries="@array/entries_list_preference"
         android:entryValues="@array/entriesvalue_list_preference"
     />

 

- EditTextPreference 使用

 

<EditTextPreference
        android:key="et1"
        android:title="EditTextPreference Sample"
        android:summary="點擊輸入"
        android:dialogTitle="輸入設置"
        android:defaultValue="Hello EditTextPreference"
     />

最後更新:2017-04-02 06:51:49

  上一篇:go DirectSound中關於IID_IDirectSound無法解析的問題
  下一篇:go 設置git使用vimdiff比較差異