从Android 3.0以后官方不再推荐直接让PreferenceActivity加载选项设置布局文件,而是建议使用PreferenceFragment,下面介绍下选项设置的使用.
继承自PreferenceFragment , 在OnCreate中加载设置文件
- 设置文件一般存放在XML资源目录下
- 每一次设置,都会将设置文件以键值对的形式进行保存,即设置文件持久化
- 设置一下SharePreference文件的名称,方便管理
// 添加要显示的配置文件
addPreferencesFromResource(R.xml.preferences);
// 设置配置文件的名称
getPreferenceManager().setSharedPreferencesName("setting");
完整的Fragment代码如下
public class PerfFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 添加要显示的配置文件
addPreferencesFromResource(R.xml.preferences);
// 设置配置文件的名称
getPreferenceManager().setSharedPreferencesName("setting");
}
/** * 当任意选项被单击时,回调此方法 * 使用getKey()获取单击的那个选项 */
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
if (preference.getKey().equals("save_pref")) {
CheckBoxPreference checkBoxPreference = (CheckBoxPreference) findPreference("save_pref");
ListPreference listPreference = (ListPreference) findPreference("mycities");
// 切换选择状态
listPreference.setEnabled(!checkBoxPreference.isChecked());
}
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
}
在Activity中通过FragmentManager事务加载配置界面
public class SettingActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setting);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
// 显示设置界面
setSupportActionBar(toolbar);
getFragmentManager().beginTransaction()
.add(R.id.id_rl_content, new PerfFragment()).commit();
}
}
设置XML配置文件
主要标签:
- PreferenceScreen 为整个设置的根视图, 嵌套表示子视图
- PreferenceCategory 为分类标签 ,将设置进行逻辑上的分组
- CheckBoxPreference 单选标签
- EditTextPreference 编辑标签,用于接收用户输入
- ListPreference 提供对话框用于选择列表标签
主要属性:
- android:key 唯一标识符,和android:id相类似,PreferenceManager可以以其为参数通过findPreference获取指定的preference 。 注意,这个android:key的值也是Preference文件里面的XML“键”名
- android:title 大标题
- android:summary 标题下面的小字(这个要作为选项卡才有)
- android:entries 弹出的对话框中,列表显示的文本内容,注意哦,这里指定的是一个数组。
- android:entryValues 与android:entries相对应的值
- android:defaultValue 当对应值不存在时的默认值
- android:dialogTitle 弹出的对话框中的标题信息
完整配置文件
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 设置的类别 -->
<PreferenceCategory android:key="mylocation" android:summary="我的位置" android:title="我的位置源 ">
<!-- 设置单选 -->
<CheckBoxPreference android:key="wireless_network" android:summary="使用无线网络查看应用程序的位置" android:title="使用无线网络" />
</PreferenceCategory>
<PreferenceCategory android:key="mymsg" android:summary="个人信息" android:title="个人信息">
<EditTextPreference android:key="myname" android:summary="姓名" android:title="请输入姓名" />
</PreferenceCategory>
<PreferenceCategory android:title="打开子界面进行选择">
<!-- 打开子界面进行设置 -->
<PreferenceScreen android:title="Open Sub Preference">
<PreferenceCategory android:key="sub1" android:title="Sub Setting 1">
<CheckBoxPreference android:defaultValue="false" android:key="sub_check" android:summary="子选项 Summary" android:title="SubCheckBox" />
</PreferenceCategory>
</PreferenceScreen>
</PreferenceCategory>
<PreferenceCategory android:key="mylocation" android:summary="我的位置" android:title="我的位置源">
<CheckBoxPreference android:key="save_pref" android:title="是否保存个人信息" android:summary="点击此选项后,City将不可编辑"/>
<ListPreference android:dialogTitle='请选择城市' android:entries='@array/cities' android:entryValues='@array/cities' android:key='mycities' android:summary='点击弹出城市列表' android:title='所属城市' />
</PreferenceCategory>
</PreferenceScreen>
存储方式
存储方式使用SharePreference进行存储键值对,在/data/data/包名/shared_prefs下生成配置文件选择情况
生成的配置文件
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="mycities">广州</string>
<boolean name="save_pref" value="false" />
<boolean name="wireless_network" value="false" />
<boolean name="sub_check" value="false" />
<string name="myname">dddaaa</string>
</map>
监听点击选项的事件
在PreferenceFragment中重写onPreferenceTreeClick()
即可监听选项点击的事件
/** * 当任意选项被单击时,回调此方法 * 使用getKey()获取单击的那个选项 */
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
if (preference.getKey().equals("save_pref")) {
CheckBoxPreference checkBoxPreference = (CheckBoxPreference) findPreference("save_pref");
ListPreference listPreference = (ListPreference) findPreference("mycities");
// 切换选择状态
listPreference.setEnabled(!checkBoxPreference.isChecked());
}
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
读取配置文件的信息
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
preferences.getXXX()
这段代码实现了一个切换状态的功能,即单击保存后,不能更该”城市”的选项了