Android Preference 設定看圖說話之基礎篇(5分鐘掌握)

北疆發表於2018-08-28

[TOC]

前言

自己獨立開發過了比較多的app,發現關於設定的UI和相關的處理自己寫不旦增加類開發工作量,而且常常會使整個程式碼層次和邏輯會變的相當混亂,讓人頭痛,在不考慮自己花時間弄一個設定管理類管理好設定程式碼,及自己處理各種UI控制元件的前提下,使用官方提供的Preference是最優也是最高效的選擇;

Android Preference 提供的控制元件

這裡只列舉常用的support.v7,其他的也大同小異 引入方式,gradle 下配置

com.android.support:preference-v7:27.1.1
複製程式碼

Android Preference 設定看圖說話之基礎篇(5分鐘掌握)

官方總結-科學上網, 使用的時候查詢對應屬性設定

android.support.v7.preference.Preference
 ↳ Known Direct Subclasses
DialogPreference,PreferenceGroup,SeekBarPreference,TwoStatePreference
Known Indirect Subclasses
CheckBoxPreference,DropDownPreference,EditTextPreference,ListPreference, MultiSelectListPreference,PreferenceCategory,PreferenceScreen, SwitchPreference, SwitchPreferenceCompat

Xml案例(For example:):

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <CheckBoxPreference
        android:key="pref_sync"
        android:title="@string/pref_sync"
        android:summary="@string/pref_sync_summ"
        android:defaultValue="true" />
    <ListPreference
        android:dependency="pref_sync"
        android:key="pref_syncConnectionType"
        android:title="@string/pref_syncConnectionType"
        android:dialogTitle="@string/pref_syncConnectionType"
        android:entries="@array/pref_syncConnectionTypes_entries"
        android:entryValues="@array/pref_syncConnectionTypes_values"
        android:defaultValue="@string/pref_syncConnectionTypes_default" />
</PreferenceScreen>
複製程式碼

Java 案例:

public class SettingsActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
    }
}
public class SettingsActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Display the fragment as the main content.
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new SettingsFragment())
                .commit();
    }
}
複製程式碼

不同版本大致區別

具體流程

Android Preference 設定看圖說話之基礎篇(5分鐘掌握)

注意: findPreference/onPreferenceTreeClick 等方法在android.preference.PreferenceActivity Api16 (4.1) 中被棄用,在PreferenceFragmentCompat中能正常使用,故官方推薦使用PreferenceFragmentCompat;

新建xml

使用組(Group)

案例:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory
        android:title="@string/pref_sms_storage_title"
        android:key="pref_key_storage_settings">
        <CheckBoxPreference
            android:key="pref_key_auto_delete"
            android:summary="@string/pref_summary_auto_delete"
            android:title="@string/pref_title_auto_delete"
            android:defaultValue="false"... />
        <Preference
            android:key="pref_key_sms_delete_limit"
            android:dependency="pref_key_auto_delete"
            android:summary="@string/pref_summary_delete_limit"
            android:title="@string/pref_title_sms_delete"... />
        <Preference
            android:key="pref_key_mms_delete_limit"
            android:dependency="pref_key_auto_delete"
            android:summary="@string/pref_summary_delete_limit"
            android:title="@string/pref_title_mms_delete" ... />
    </PreferenceCategory>
    ...
</PreferenceScreen>
複製程式碼

效果如圖

使用子螢幕(subscreens)

案例程式碼:

<PreferenceScreen  xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- opens a subscreen of settings -->
    <PreferenceScreen
        android:key="button_voicemail_category_key"
        android:title="@string/voicemail"
        android:persistent="false">
        <ListPreference
            android:key="button_voicemail_provider_key"
            android:title="@string/voicemail_provider" ... />
        <!-- opens another nested subscreen -->
        <PreferenceScreen
            android:key="button_voicemail_setting_key"
            android:title="@string/voicemail_settings"
            android:persistent="false">
            ...
        </PreferenceScreen>
        <RingtonePreference
            android:key="button_voicemail_ringtone_key"
            android:title="@string/voicemail_ringtone_title"
            android:ringtoneType="notification" ... />
        ...
    </PreferenceScreen>
    ...
</PreferenceScreen>
複製程式碼

效果如圖

使用intents

<Preference android:title="@string/prefs_web_page" >
    <intent android:action="android.intent.action.VIEW"
            android:data="http://www.example.com" />
</Preference>
複製程式碼

屬性有:

  • android:action
  • android:data
  • android:mimeType
  • android:targetClass
  • android:targetPackage

請注意:上面的設定已經夠日常使用

處理

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String syncConnPref = sharedPref.getString(SettingsActivity.KEY_PREF_SYNC_CONN, "");
複製程式碼

監聽

  • findPreference裡面的引數就是我們使用android:key所定義
  • onPreferenceTreeClick Prefs tree點選時呼叫 註冊方式:
@Override
protected void onResume() {
    super.onResume();
    getPreferenceScreen().getSharedPreferences()
            .registerOnSharedPreferenceChangeListener(this);
}

@Override
protected void onPause() {
    super.onPause();
    getPreferenceScreen().getSharedPreferences()
            .unregisterOnSharedPreferenceChangeListener(this);
}
複製程式碼

設定監聽方式:

SharedPreferences.OnSharedPreferenceChangeListener listener =
    new SharedPreferences.OnSharedPreferenceChangeListener() {
  public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    // listener implementation
  }
};
prefs.registerOnSharedPreferenceChangeListener(listener);
複製程式碼

使用小案例

還原初始設定

PreferenceManager.setDefaultValues(Context, R.xml.advanced_preferences, false);
複製程式碼
  • false : 首次呼叫生效;(true 每次呼叫都生效)

麵包原材料

相關文章