安卓开源框架androidAndroid实践

Android设置界面之Preference

2016-10-28  本文已影响5867人  CoderMiner

Android设置界面之Preference

题图 www.gratisography.com

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

概述

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

在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

使用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">
  <!-- 添加对应的preference 如PreferenceScreen EditTextPreference 等-->
</PreferenceCategory>
<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

<?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>元素中的内容,可以通过Bundle获得,通过方法getArguments()获取

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

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

自定义Preference的布局

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

上一篇下一篇

猜你喜欢

热点阅读