Android Preference 設置偏好全攻略

来源:http://www.cnblogs.com/valenhua/archive/2017/10/03/7624640.html
-Advertisement-
Play Games

Android 設置是每個App必不可小的東西,看似很簡單,但是初學不熟悉的很花時間去研究,特別樣式相容方面,以及有自定義設置的需求,下麵是對用法做一個總結 ...


Android 設置是每個App必不可小的東西,看似很簡單,但是初學不熟悉的很花時間去研究,特別樣式相容方面,以及有自定義設置的需求,下麵是對用法做一個總結

Preference結構

界面結構看下圖


界面主要由PrefercenScreen、PreferenceCategory和Preference三個主要部分組成

  • PrefercenScreen最根的部分;
  • PreferenceCategory是每個設置的分組;
  • Preference是具體到每個設置元素;

    XML文件

    XML結構層級大致如圖

    <android.support.v7.preference.PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android">
    <android.support.v7.preference.PreferenceCategory
        android:title="preference v7">
        <android.support.v7.preference.CheckBoxPreference
            android:defaultValue="false"
            android:key="key_checkbox"
            android:summaryOff="@string/theme_light"
            android:summaryOn="@string/theme_dark"
            android:title="Checkbox"
            />
    </android.support.v7.preference.PreferenceCategory>
    </android.support.v7.preference.PreferenceScreen>

    類庫

    由於Android版本升級,Preference加上原生的供有四個版本類庫,根據API的最低版本使用相應的類庫,如果你的最低版本是11,使用PreferenceFragment的話就可不使用相容庫。下麵對每個包層次整理一下

android.preference

PreferenceFragment
如果你的安卓最低版本面向11以上的,可以直接使用這個包為基礎

android.support.v7.preference

android.support.v14.preference

android.support.v17.preference

這個包主要面向電視,暫時不深入研究,具體特性遲點再補充

Preference介紹

Preference
  • Preference 是所有設置項目的基類,很多屬性都從這個類派生出來。
    它有android.preference.Preference和 android.support.v7.preference.Preference兩個部分,大致用法相同,詳細請參考文檔;

  • 從文檔可瞭解到android.preference.Preference 是針對PreferenceActivity
    ListView舊款偏好而設計,而android.support.v7.preference.Preference則適合
    用RecyclerView重新設計的PreferenceFragmentCompat,使用的時候對號入座就可以了;

  • 他們都是內置 SharedPreferences 以及對應的android:key屬性來存儲數據

關鍵屬性:

  • android:title,顯示的標題;
  • android:summary,標題下麵對應的摘要;
  • android:key,存儲數據的鍵值;
  • android:dependency: 這是一個鍵值,如果設置,必須依賴key這個才可以啟用;
PreferenceScreen

它是所有偏好的根節點:

  • 當它放在根部的時候是不顯示的;
  • 當它放在節點位置的顯示,點擊顯示它的子元素;
    如圖:


    PreferenceCategory

    這個很簡單就是一個分組的效果,只要設置好標題就可以了

    MultiSelectListPreference
    顯示多選對話框,存儲多項數據,關鍵屬性:
  • android:entries,顯示欄目數據
  • android:entryValues,欄目對應的值
  • android:defaultValue 預設值,數組

通過上面的架構發現,到v7下麵沒有了MultiSelectListPreference,只有
MultiSelectListPreferenceDialogFragmentCompat,原因不得而知,估計是google想只提供對話框給開發者自己實現,但是到了v14下麵MultiSelectListPreference回歸了,原因不深入,直接使用就可以。

<MultiSelectListPreference
            android:defaultValue="@array/deflistItems"
            android:dialogTitle="MultiSelectListPreferenceDialog"
            android:entries="@array/listItems"
            android:entryValues="@array/listItems"
            android:key="key_multi_select_list_pref"
            android:summary="MultiSelectListPreference summary"
            android:title="MultiSelectListPreference"
  />

效果圖

ListPreference

顯示單選對話框,存儲單項數據,關鍵屬性:

  • android:entries,顯示欄目數據
  • android:entryValues,欄目對應的值
  • android:defaultValue 預設值

ListPreference 存在原生和v7包下麵,v14只保留ListPreferenceDialogFragment

<ListPreference
     android:defaultValue="Item4"
     android:dialogTitle="ListPreferenceDialog"
     android:entries="@array/listItems"
     android:entryValues="@array/listItems"
     android:key="key_list_pref"
     android:summary="ListPreference summary"
     android:title="ListPreference"
     />

效果圖:

EditTextPreference

EditTextPreference繼承DialogPreference,然後編輯對戶框可以輸入文字並保存
EditTextPreference存在原生和v7包下麵,v14只保留EditTextPreferenceDialogFragment
關鍵屬性:

  • android:defaultValue 預設值
 <EditTextPreference
            android:defaultValue="defaultValue"
            android:key="key_edittext"
            android:summary="EditTextPreference summary"
            android:title="EditTextPreference"
 />

效果圖

CheckBoxPreference

選擇框偏好,CheckBoxPreference存在原生和v7包下麵
關鍵屬性:

  • android:defaultValue 預設值
  • android:summaryOff: 取消選擇的時候顯示文字
  • android:summaryOn:選擇的時候顯示文字
 <CheckBoxPreference
            android:defaultValue="false"
            android:key="key_checkbox"
            android:summaryOff="@string/theme_light"
            android:summaryOn="@string/theme_dark"
            android:title="Checkbox"
    />

效果圖

SwitchPreference

開關編好,使用也比較簡單,原生和v14都有,v7下麵是SwitchPreferenceCompat
關鍵屬性:

  • android:defaultValue 預設值
  • android:summaryOff: 關閉時候顯示文字
  • android:summaryOn: 開啟時候顯示文字
  • android:switchTextOff: 關閉時候開關上顯示的文字
  • android:switchTextOn:開啟時候開關上顯示的文字

    <SwitchPreference
            android:defaultValue="false"
            android:switchTextOff="@string/theme_light"
            android:switchTextOn="@string/theme_dark"
            android:summaryOff="@string/theme_light"
            android:summaryOn="@string/theme_dark"
            android:title="SwitchPreference"/>
    
        <android.support.v7.preference.SwitchPreferenceCompat
            android:defaultValue="false"
            android:summaryOff="@string/theme_light"
            android:summaryOn="@string/theme_dark"
            android:switchTextOff="@string/theme_light"
            android:switchTextOn="@string/theme_dark"
            android:title="SwitchPreferenceCompat"/>
    
        <android.support.v14.preference.SwitchPreference
            android:defaultValue="false"
            android:key="key_dark_theme_v14"
            android:switchTextOff="@string/theme_light"
            android:switchTextOn="@string/theme_dark"
            android:summaryOff="@string/theme_light"
            android:summaryOn="@string/theme_dark"
            android:title="v14.preference.SwitchPreference"/>

經過測試,SwitchPreferenceCompat 全平臺material design風格,開關樣式如圖看出
android.support.v14.preference.SwitchPreference和SwitchPreference Android5.0以下,按鈕還是保留老樣式,可以顯示文字

效果圖

RingtonePreference

鈴聲選擇編好,只存在原生包上面
關鍵屬性:
android:ringtoneType 鈴聲類型分四個選項:

  • alarm:只顯示鬧鐘聲
  • all: 顯示所有
  • notification: 只顯示通知聲
  • ringtone 只顯示鈴聲
    android:showDefault: 是否顯示預設選項,預設顯示

    android:showSilent 是否顯示靜音選項,預設顯示

    效果:

    SeekBarPreference

    微調偏好設置,SeekBarPreference只在v7包下存在
    關鍵屬性
    app:showSeekBarValue: 是否顯示進度數字
    android:defaultValue: 預設值

     <android.support.v7.preference.SeekBarPreference
       android:key="key_seekbar"
       android:title="SeekBarPreference"
       app:showSeekBarValue="false"
       android:defaultValue="50"
      />

    和ListPreference差不多,只不過是用下拉的樣式代替對話框

    <android.support.v7.preference.DropDownPreference
            android:defaultValue="Item4"
            android:dialogTitle="DropDownDialog"
            android:entries="@array/listItems"
            android:entryValues="@array/listItems"
            android:summary="DropDownPreference summary"
            android:title="DropDownPreference"
    />

    效果圖:

    Preference自定義

    以上偏好都不能滿足的時候需要自定義,例如我的App軟體上定義了一個關於的對話框
    先看看效果是這樣的:

  • 我們需要定義preference,通過繼承自定義DialogPreferece,代碼如下

public class AboutDialogPreference extends DialogPreference {
public static final String KEY_ABOUT_DIALOG = "key_about_dialog";
public AboutDialogPreference(Context context, AttributeSet attrs) {
  super(context, attrs);
  setKey(KEY_ABOUT_DIALOG);
  setTitle(R.string.about);
  setSummary(getContext().getString(R.string.app_name) + PkgUtils.get(getContext()).getAppVerName());
 }
}
  • 然後自定義對話框
    關鍵一點,newInstance()必須帶上AboutDialogPreference的key,否則會出錯
    ```
    public class AboutPreferenceDialogFragment extends PreferenceDialogFragmentCompat {

public static AboutPreferenceDialogFragment newInstance() {
Bundle args = new Bundle();
args.putString(ARG_KEY, AboutDialogPreference.KEY_ABOUT_DIALOG);
AboutPreferenceDialogFragment fragment = new AboutPreferenceDialogFragment();
fragment.setArguments(args);
return fragment;
}

@Override
protected View onCreateDialogView(Context context) {
return View.inflate(context, R.layout.fragment_preference_about_dialog, null);
}

@Override
protected void onBindDialogView(View view) {
AppCompatTextView messageView = (AppCompatTextView) view;
messageView.setText(getInfo());
}

private String getInfo() {
String systemInfo = getString(R.string.model) + " " + Build.MODEL + "\n"

  • getString(R.string.system) + " Android "
  • Build.VERSION.RELEASE + "(API:" + Build.VERSION.SDK_INT + ")";
    PackageInfo info = PkgUtils.get(getContext()).getPackageInfo(getContext().getPackageName());
    String pkg = info != null ? info.versionName + (BuildConfig.DEBUG ? " debug" : "") : "";
    return getString(R.string.about_intro, getString(R.string.app_name) + pkg, systemInfo);
    }

@Override
protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
builder.setIcon(R.mipmap.ic_launcher);
builder.setTitle(R.string.about);
builder.setNeutralButton(R.string.privacy_policy, (dialogInterface, i) -> {
TXWebViewActivity.browse(getContext(),
getContext().getString(R.string.privacy_policy),
TXApplication.URL_PRIVACY, false);
});
builder.setPositiveButton(R.string.app_detail, (dialogInterface, i) -> { IntentUtils.get(getContext()).showAppDetails(getContext().getPackageName());
});
}

@Override
public void onDialogClosed(boolean positiveResult) {
}
}


- 最後在SettingFragment主界面做處理
在onDisplayPreferenceDialog裡面判斷並且實例化AboutPreferenceDialogFragment,然後顯示對話框

public class SettingFragment extends PreferenceFragmentCompat{

@Override
public void onDisplayPreferenceDialog(Preference preference) {
DialogFragment dialogFragment = null;
if (preference instanceof AboutDialogPreference) {
dialogFragment = AboutPreferenceDialogFragment.newInstance();
}
if (dialogFragment != null) {
dialogFragment.setTargetFragment(this, 0);
dialogFragment.show(this.getFragmentManager(), "");
} else {
super.onDisplayPreferenceDialog(preference);
}
}
}
```

總結

  • Preference掌握關鍵必須理清類的集成關係,主要是Preference,分對話框Preference和普通雙態Preference,並且掌握他們的擴展的
  • PreferenceActivity和PreferenceFragment模式的差異
  • 理清每個支持庫的差異,多在模擬器實踐驗證
  • 掌握關鍵屬性,多看文檔

更詳細請看:
http://tinyx.cc/blog/android/android-preference.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在動畫過程中取消動畫 之前提到過,你可以用-addAnimation:forKey:方法中的key參數來在添加動畫之後檢索一個動畫,使用如下方法: 但並不支持在動畫運行過程中修改動畫,所以這個方法主要用來檢測動畫的屬性,或者判斷它是否被添加到當前圖層中。 為了終止一個指定的動畫,你可以用如下方法把它 ...
  • Feature: 點擊選擇拍照或者打開相冊,選取圖片進行裁剪最後設置為圓形頭像。 Problem: 拍好照片,點擊裁剪,彈Toast“無法載入此圖片”。 Solution: 在裁剪的class裡加兩行代碼 主要代碼如下: ...
  • 屬性動畫 CAAnimationDelegate在任何頭文件中都找不到,但是可以在CAAnimation頭文件或者蘋果開發者文檔中找到相關函數。在這個例子中,我們用-animationDidStop:finished:方法在動畫結束之後來更新圖層的backgroundColor。 當更新屬性的時候, ...
  • 呈現與模型 CALayer的屬性行為其實很不正常,因為改變一個圖層的屬性並沒有立刻生效,而是通過一段時間漸變更新。這是怎麼做到的呢? 當你改變一個圖層的屬性,屬性值的確是立刻更新的(如果你讀取它的數據,你會發現它的值在你設置它的那一刻就已經生效了),但是屏幕上並沒有馬上發生改變。這是因為你設置的屬性 ...
  • 圖層行為 現在來做個實驗,試著直接對UIView關聯的圖層做動畫而不是一個單獨的圖層。清單7.4是對清單7.2代碼的一點修改,移除了colorLayer,並且直接設置layerView關聯圖層的背景色。 清單7.4 直接設置圖層的屬性 1 @interface ViewController () 2 ...
  • 事務 Core Animation基於一個假設,說屏幕上的任何東西都可以(或者可能)做動畫。動畫並不需要你在Core Animation中手動打開,相反需要明確地關閉,否則他會一直存在。 當你改變CALayer的一個可做動畫的屬性,它並不能立刻在屏幕上體現出來。相反,它是從先前的值平滑過渡到新的值。 ...
  • AVPlayerLayer 最後一個圖層類型是AVPlayerLayer。儘管它不是Core Animation框架的一部分(AV首碼看上去像),AVPlayerLayer是有別的框架(AVFoundation)提供的,它和Core Animation緊密地結合在一起,提供了一個CALayer子類來 ...
  • 1. 下載Charles Proxy 4.2版本,百度雲盤下載或去官網下載 2. 安裝後先打開Charles一次(Windows版可以忽略此步驟) 3. 在這個網站(http://charles.iiilab.com/)下載破解文件 charles.jar 4. 替換掉原文件夾里的charles.j ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...