Android PreferenceFragment实现设置界面

时间:2022-02-06 00:02:36

从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>

Android PreferenceFragment实现设置界面

存储方式

存储方式使用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()

这段代码实现了一个切换状态的功能,即单击保存后,不能更该”城市”的选项了
Android PreferenceFragment实现设置界面