Android设置界面之Preference

转载自简书:http://www.jianshu.com/p/6d6f84e2f50d

Android系统为设置界面的UI提供了一系列的接口,设置界面的部分和Activity是分离的,会有一个PreferenceScreen的对象
是根目录,在其中会包含CheckBoxPreference EditTextPreference ListPreference PreferenceCategory RingtonePreference

  • 相关的接口

    Preference.OnPreferenceChangeListener
    Preference.OnPreferenceClickListener
    PreferenceFragment.OnPreferenceStartFragmentCallback
    PreferenceManager.OnActivityDestroyListener
    PreferenceManager.OnActivityResultListener
    PreferenceManager.OnActivityStopListener
  • 相关的类

    CheckBoxPreference
    DialogPreference
    EditTextPreference
    ListPreference
    MultiSelectListPreference
    Preference
    Preference.BaseSavedState
    PreferenceActivity
    PreferenceActivity.Header
    PreferenceCategory
    PreferenceFragment
    PreferenceGroup
    PreferenceManager
    PreferenceScreen
    RingtonePreference
    SwitchPreference
    TwoStatePreference

概述

由于设置的界面是使用Preference而不是View来创建的,需要特殊的Activity或者Fragment的子类来显示

  • 版本低于Android 3.0(API 10),请使用PreferenceActivity
  • 版本高于Android 3.0(API 10),可以在普通的Activity中使用PreferenceFragment来显示,也可以使用PreferenceActivity

在XML中定义Preference

可以在运行时创建Preference也可以通过在xml中定义Preference,每一个Preference的子类都可以用XML中的元素来定义,在 res/xml/
文件夹中创建一个文件如preference.xml

如果想定义分屏的设置布局,需要分别定义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>

创建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)的版本,应该使用PreferenceFragment来显示Preference,就不需要继承PreferenceActivity
继承PreferenceFragmentonCreate()方法中调用addPreferencesFromResource()方法

  public class SettingsFragment extends PreferenceFragment{

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.addPreferencesFromResource(R.xml.preference);
    }

  }

创建一个Activity,然后将定义的Fragments添加到当前的Activity中,最终呈现的效果和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">
    
    PreferenceCategory>
  • list view preference

    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"/>
  • 输入框

    "edit_preference"
            android:title="@string/title_edittext_preference"
            android:summary="@string/summary_edittext_preference"
            android:dialogTitle="@string/dialog_title_edittext_preference"
            />

使用Preference Header

  • 为每一个设置文件单独创建一个PreferenceFragment的实例
  • 创建headers的XML文件,在fragment中设置对应的PreferenceFragment的实例
  • 使用PreferenceActivity
  • 实现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>

    元素中的内容,可以通过Bundle获得,通过方法getArguments()获取

    显示headers使用PreferenceActivity的回调方法onBuildHeaders()加载preference-headers.xml文件

    @Override
    public void onBuildHeaders(List
    target) { super.onBuildHeaders(target); loadHeadersFromResource(R.xml.preference_header, target); }

自定义Preference的布局

通过Preference的属性android:layout=""设置自定义的layout文件

你可能感兴趣的:(Android用法,转载)