必须得说选项设置在之前进行pc端的开发中往往是一件很简单但是boring的事情,并不了解android开发的情况下我本来准备用之前那些粗暴方式解决的。但是在书上学到了preferenceActivity,看起来很赞,所以先写个demo练习一下。
PreferenceActivity并不是一个不同的activity,它不再使用普通的界面布局文件,而是使用选项配置的布局文件。选项设置的布局文件以preferenceScreen作为根元素——它表示定义一个参数设置的界面布局。
创建PreferenceActivity之前得先创建一个选项设置的布局文件,我使用的是android studio,在res/xml下面直接创建一个xml resource file即可得到一个空的选项配置文件。此处创建的文件会直接以preferencescreen为根元素。但是Android 3.0以后,摒弃了传统的preferencescreen嵌套方法,即不再推荐让activity直接加载选项配置布局文件,而是采用了preference-headers方法,该方法的要点是:在主屏中通过headers xml文件布局列出所有的主题设置项,而每个主题设置的详细设置则由各自指定的PreferenceFragment负责,而各自的PreferenceFragment可以如传统的PreferenceActivity一样布局自身的preferencescreen,即加载选项配置布局文件。
PreferenceActivity的选项配置列表的布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<!--启动指定fragement的列表项-->
<header android:fragment="com.example.preference.MainActivity$Fragment1"
android:icon="@color/colorAccent"
android:title="程序选项设置"
android:summary="设置相关选项"></header>
<header android:fragment="com.example.preference.MainActivity$Fragment2"
android:icon="@color/colorPrimary"
android:title="程序选项设置"
android:summary="设置相关选项"></header>
</preference-headers>
而后是创建fragment对应布局文件:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<RingtonePreference
android:ringtoneType="all"
android:title="设置铃声"
android:summary="test RingtonePreference"
android:showDefault="true"
android:key="ring_key"
android:showSilent="true">
</RingtonePreference>
<PreferenceCategory android:title="个人信息设置">
<EditTextPreference
android:key="name"
android:title="username"
android:summary="test EditTextPreference"
android:dialogTitle="您的用户名为:"/>
<ListPreference
android:key="gender"
android:title="性别"
android:summary="test ListPreference"
android:dialogTitle="ListPreference"
android:entries="@array/gender_options"
android:entryValues="@array/gender_options_values"/>
<CheckBoxPreference
android:key="autoSave"
android:title="自动保存进度"
android:summaryOn="自动保存:开启"
android:summaryOff="自动保存:关闭"
android:defaultValue="true"/>
</PreferenceCategory>
</PreferenceScreen>
里面的ListPreference需要在/res/values/array.xml文件中创建字符串数组后使用,android:entries用于展示给用户,而android:entryValues则是对应后台默认值。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="gender_options">
<item>男</item>
<item>女</item>
<item>中性。。。</item>
</string-array>
<string-array name="gender_options_values">
<item>0</item>
<item>1</item>
<item>2</item>
</string-array>
</resources>
然后创建对应activity:
package com.example.preference;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.support.annotation.Nullable;
import android.widget.Button;
import java.util.List;
public class MainActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(hasHeaders()){
Button button = new Button(this);
button.setText("设置操作");
setListFooter(button);
}
}
//重写该方法,负责加载界面布局文件
@Override
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.preference_header,target);
}
@Override
protected boolean isValidFragment(String fragmentName) {
return true;
}
public static class Fragment1 extends PreferenceFragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
public static class Fragment2 extends PreferenceFragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
}
嗯,跑出来比我之前血炸的自己乱写的东西强多了,默哀。。。
最后在跑完之后还可以在DDMS中去查看选项设置生成的xml文件信息。
嗯,最近看了不少android中的布局,组件,觉得很多之前觉得很难以搞定的东西在前辈们精巧构思基础上变得其实很,嗯。。。平易近人?好吧,写一篇自己学到的PreferenceAcitivity实现参数设置文件的文章,更近于学习记录。嗯,就是这样了,好困,歇会儿。。。