Android設(shè)置界面之Preference
Android
系統(tǒng)為設(shè)置界面的UI提供了一系列的接口谈山,設(shè)置界面的部分和Activity
是分離的,會有一個PreferenceScreen
的對象
是根目錄,在其中會包含CheckBoxPreference
EditTextPreference
ListPreference
PreferenceCategory
RingtonePreference
-
相關(guān)的接口
Preference.OnPreferenceChangeListener Preference.OnPreferenceClickListener PreferenceFragment.OnPreferenceStartFragmentCallback PreferenceManager.OnActivityDestroyListener PreferenceManager.OnActivityResultListener PreferenceManager.OnActivityStopListener
-
相關(guān)的類
CheckBoxPreference DialogPreference EditTextPreference ListPreference MultiSelectListPreference Preference Preference.BaseSavedState PreferenceActivity PreferenceActivity.Header PreferenceCategory PreferenceFragment PreferenceGroup PreferenceManager PreferenceScreen RingtonePreference SwitchPreference TwoStatePreference
概述
由于設(shè)置的界面是使用Preference
而不是View
來創(chuàng)建的果漾,需要特殊的Activity
或者Fragment
的子類來顯示
- 版本低于
Android 3.0(API 10)
壳猜,請使用PreferenceActivity
- 版本高于
Android 3.0(API 10)
,可以在普通的Activity
中使用PreferenceFragment
來顯示囚聚,也可以使用PreferenceActivity
在XML中定義Preference
可以在運行時創(chuàng)建Preference
也可以通過在xml中定義Preference
,每一個Preference
的子類都可以用XML中的元素來定義靖榕,在 res/xml/
文件夾中創(chuàng)建一個文件如preference.xml
如果想定義分屏的設(shè)置布局,需要分別定義XML
preference.xml
一般的布局如下:
<?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>
創(chuàng)建PreferenceActivity
-
定義xml文件
在
res/xml/
文件夾中定義preference.xml
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="@string/inline_preferences"> <CheckBoxPreference android:key="check_box_pref" android:title="@string/title_checkbox_preference" android:summary="@string/summary_checkbox_preference"> ..... </CheckBoxPreference> </PreferenceCategory> </PreferenceScreen>
-
Activity
繼承PreferenceActivity
public class SettingsActivity1 extends PreferenceActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preference); //API 10之后的版本這個方法以及過時顽铸,推薦使用Fragment的方式 } }
使用Preference Fragments
在高于Android 3.0(API 10)
的版本茁计,應(yīng)該使用PreferenceFragment
來顯示Preference
,就不需要繼承PreferenceActivity
繼承PreferenceFragment
在onCreate()
方法中調(diào)用addPreferencesFromResource()
方法
public class SettingsFragment extends PreferenceFragment{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.addPreferencesFromResource(R.xml.preference);
}
}
創(chuàng)建一個Activity
,然后將定義的Fragments添加到當(dāng)前的Activity
中,最終呈現(xiàn)的效果和PreferenceActivity
是一樣的
public class SettingsActivity2 extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.getFragmentManager().beginTransaction()
.replace(android.R.id.content, new SettingsFragment())
.commit();
}
}
- 顯示新條目
<PreferenceCategory
android:title="@string/dialog_based_preferences">
<!-- 添加對應(yīng)的preference 如PreferenceScreen EditTextPreference 等-->
</PreferenceCategory>
- list view preference
<ListPreference
android:key="list_preference"
android:title="@string/title_list_preference"
android:summary="@string/summary_list_preference"
android:entries="@array/entries_list_preference"
android:entryValues="@array/entryvalues_list_preference"
android:dialogTitle="@string/dialog_title_list_preference"/>
- 輸入框
<EditTextPreference
android:key="edit_preference"
android:title="@string/title_edittext_preference"
android:summary="@string/summary_edittext_preference"
android:dialogTitle="@string/dialog_title_edittext_preference"
/>
使用Preference Header
- 為每一個設(shè)置文件單獨創(chuàng)建一個
PreferenceFragment
的實例 - 創(chuàng)建headers的XML文件,在fragment中設(shè)置對應(yīng)的
PreferenceFragment
的實例 - 使用
PreferenceActivity
- 實現(xiàn)
obBuildHeaders()
方法
<?xml version="1.0" encoding="utf-8"?>
<preference-headers
xmlns:android="http://schemas.android.com/apk/res/android">
<header
android:fragment="com.example.demo.preference$PrefsFragment1"
android:title="Pref 1"
android:summary="An example of some preferences.">
</header>
<header
android:fragment="com.example.demo.preference$PrefsFragment2"
android:title="Pref 2"
android:summary="Another example of some preferences.">
</header>
<extra android:name="test" android:value="testvalue" />
</preference-headers>
<extras>
元素中的內(nèi)容,可以通過Bundle
獲得星压,通過方法getArguments()
獲取
顯示headers使用PreferenceActivity
的回調(diào)方法onBuildHeaders()
加載preference-headers.xml文件
@Override
public void onBuildHeaders(List<Header> target) {
super.onBuildHeaders(target);
loadHeadersFromResource(R.xml.preference_header, target);
}
自定義Preference的布局
通過Preference
的屬性android:layout=""
設(shè)置自定義的layout文件