Android設(shè)置界面之Preference

Android設(shè)置界面之Preference

題圖 www.gratisography.com

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
繼承PreferenceFragmentonCreate()方法中調(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文件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末践剂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子娜膘,更是在濱河造成了極大的恐慌逊脯,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竣贪,死亡現(xiàn)場離奇詭異军洼,居然都是意外死亡,警方通過查閱死者的電腦和手機演怎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門匕争,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人爷耀,你說我怎么就攤上這事甘桑。” “怎么了歹叮?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵跑杭,是天一觀的道長。 經(jīng)常有香客問我咆耿,道長德谅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任票灰,我火速辦了婚禮女阀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屑迂。我一直安慰自己浸策,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布惹盼。 她就那樣靜靜地躺著庸汗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪手报。 梳的紋絲不亂的頭發(fā)上蚯舱,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天,我揣著相機與錄音掩蛤,去河邊找鬼枉昏。 笑死,一個胖子當(dāng)著我的面吹牛揍鸟,可吹牛的內(nèi)容都是我干的兄裂。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晰奖!你這毒婦竟也來了谈撒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤匾南,失蹤者是張志新(化名)和其女友劉穎啃匿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛆楞,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡溯乒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了臊岸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片橙数。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖帅戒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情崖技,我是刑警寧澤逻住,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站迎献,受9級特大地震影響瞎访,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吁恍,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一扒秸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冀瓦,春花似錦伴奥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至感局,卻和暖如春尼啡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背询微。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工崖瞭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人撑毛。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓书聚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子寺惫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容