PreferenceActivity
在开发应用程序时,有时我们会有选项设置界面,通常我们可以使用SharePreference以键值对的形式进行保存。Android为我们提供了PreferenceActivity。PreferencesActivity是Android中专门用来实现程序设置界面及参数存储的一个Activity。
我们只要把Activity继承PreferenceActivity, PreferenceActivity会帮我们处理选项的读写。从Android3.0开始,官方不推荐单独使用PreferenceActivity,而是建议PreferenceActivity与PreferenceFragment结合使用。
PreferenceActivity结合PreferenceFragment实现选项设置
官方建议PreferenceActivity与PreferenceFragment结合使用,其中PreferenceActivity负责加载选项配置列表的布局文件,PreferenceFragment负责加载选项配置的布局文件。
在res下创建xml目录来创建布局
例如:
PreferenceActivity加载的布局如下,不是layout,而是preference-headers。
res/xml/pref_headers.xml
我们可以通过android:fragment来指定启动PreferenceFragment,当然了,也可以通过Intent来启动指定Activity。
Activity:
public class PreferenceActivityWithPreferenceFragment extends AppCompatPreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void onBuildHeaders(List target) {
//加载选项列表布局
loadHeadersFromResource(R.xml.pref_headers, target);
}
/**
* 验证Preference是否有效
*
* @param fragmentName
* @return
*/
protected boolean isValidFragment(String fragmentName) {
return true;
}
/**
* GeneralPreferenceFragment
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class GeneralPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_general);
}
}
}
- PreferenceActivity负责加载选项配置列表的布局文件
preference-headers根标签相当于一个列表,header标签相当于每个Item。
如下:
- PreferenceFragment负责加载选项配置的布局文件
res/xml/pref_general.xml
如下:
完成效果如下:
- 我们来看看提供了哪几种布局元素可供使用
1.CheckBoxPreference:CheckBox选择项,对应的值的ture或flase。如图:
2.EditTextPreference:输入编辑框,值为String类型,会弹出对话框供输入。
3.ListPreference: 列表选择,弹出对话框供选择。
4.Preference:只进行文本显示,需要与其他进行组合使用。
5.PreferenceCategory:用于分组。效果如下:
6.PreferenceScreen:PreferenceActivity的根元素。
7.RingtonePreference:系统铃声选择。
8.MultiSelectListPreference:列表选择(多选)
9.SwitchPreference:Switch
接着上面,PreferenceFragment布局修改如下:
res/xml/pref_general.xml布局
android:entries="@array/city"
android:entryValues="@array/country"
- 北京
- 上海
- 广州
- 深圳
- A
- B
- C
- D
效果如图:
PreferenceCategory属性:
key:唯一标识(至少在同一程序中是唯一),SharedPreferences也将通过此Key值进行数据保存,也可以通过key值获取保存的信息。
title:显示标题(大字体显示)
summary:副标题(小字体显示)
defaultValue:默认值
dependency:附属,即标识此元素附属于某一个元素(通常为CheckBoxPreference),dependency值为所附属元素的key。当CheckPreference值为true时,Preference则为可用,否则为不可用。
dialogTitle:弹出对话框的标题
entries:列表中显示的值。为一个数组,通常通过资源文件进行设置。
entryValues:列表中实际保存的值,与entries对应。(上面的city和county)
写个例子
例子直接用的Activity结合PreferenceFragment实现
我们用PreferenceScreen来实现下图布局
res/xml/pref_my.xml布局
MyFragment:
public class MyFragment extends PreferenceFragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getPreferenceManager().setSharedPreferencesMode(MODE_WORLD_READABLE);
addPreferencesFromResource(R.xml.pref_my);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Preference one = findPreference("one");
one.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(getActivity(), "one", Toast.LENGTH_SHORT).show();
return true;
}
});
findPreference("two").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(getActivity(), "two", Toast.LENGTH_SHORT).show();
return true;
}
});
findPreference("three").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(getActivity(), "再点一下试试", Toast.LENGTH_SHORT).show();
return true;
}
});
findPreference("four").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(getActivity(), "试试就试试", Toast.LENGTH_SHORT).show();
return true;
}
});
}
}
Activity:
public class ActivityWithPreferenceFragment extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_with_preference_fragment);
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fl, new MyFragment()).commit();
}
}
开篇有说到Preference以键值对的形式进行保存,所以我给每一项设置了一个key。这个的作用和我们常用的id差不多,一会如果我们要引用这个组件可以通过key来找到他。
我们来加几个点击事件
OnPreferenceClickListener 用来监听某个选项是否被点击
public class MyFragment extends PreferenceFragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getPreferenceManager().setSharedPreferencesMode(MODE_WORLD_READABLE);
addPreferencesFromResource(R.xml.pref_my);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Preference one = findPreference("one");
one.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(getActivity(), "one", Toast.LENGTH_SHORT).show();
return true;
}
});
findPreference("two").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(getActivity(), "two", Toast.LENGTH_SHORT).show();
return true;
}
});
findPreference("three").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(getActivity(), "再点一下试试", Toast.LENGTH_SHORT).show();
return true;
}
});
findPreference("four").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(getActivity(), "试试就试试", Toast.LENGTH_SHORT).show();
return true;
}
});
}
}
通过key找到对应组件
findPreference("two").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(getActivity(), "two", Toast.LENGTH_SHORT).show();
return true;
}
});
运行一下:
程序的完整源代码
GitHub:https://github.com/Rairmmd/RairDemo/
Coding:https://git.coding.net/Rair/RairDemo.git