Android设置界面之Preference
题图 www.gratisography.comAndroid
系统为设置界面的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
继承PreferenceFragment
在onCreate()
方法中调用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>
- 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
- 为每一个设置文件单独创建一个
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>
<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文件
网友评论
我写一个设置界面的时候运行出现了这样的错误 怎么破
public class SettingsFragment extends PreferenceFragment{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.addPreferencesFromResource(R.xml.preferences);
}
}
public class SettingsActivity extends PreferenceActivity {
private SettingsFragment mSettingsFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
if (savedInstanceState==null){
mSettingsFragment=new SettingsFragment();
replaceFragment(R.id.settings_container,mSettingsFragment);
}
}
public void replaceFragment(int viewId,android.app.Fragment fragment){
FragmentManager fragmentManager=getFragmentManager();
fragmentManager.beginTransaction().replace(viewId,fragment).commit();
}
}