当我们在开发项目的时候,经常需要使用到选项设置。设置由用户选定,并通过Preference保存。Android提供了这样一个便捷的基类PreferenceFragment。
简单步骤:
1.创建xml文件
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory
android:summary="firstsummary"
android:title="firstlist" >
<CheckBoxPreference
android:key="checkbox"
android:summaryOff="已经关闭"
android:summaryOn="已经开启"
android:title="是否开启" />
<ListPreference
android:entries="@array/entries"
android:entryValues="@array/values"
android:key="list"
android:summary="请点击选择"
android:title="选择一个选项" />
<EditTextPreference
android:dialogMessage="有劳了"
android:dialogTitle="请输入你的名字"
android:key="text"
android:summary="请在此输入"
android:title="请输入" />
</PreferenceCategory>
<PreferenceScreen
android:summary="lalala"
android:title="secondlist" >
<EditTextPreference
android:dialogMessage="请在下面输入"
android:dialogTitle="请输入你的名字"
android:key="text"
android:summary="请在此输入"
android:title="请输入" />
</PreferenceScreen>
</PreferenceScreen>
PreferenceScreen为根标签,ListPreference为子标签。ListPreference的常见属性如下:android:key 唯一标识符,和android:id相类似,可以以其为参数通过findPreference获取指定的preference 。 注意,这个android:key的值也是Preference文件里面的XML“键“名 。
android:title 大标题
android:summary 标题下面的小字(这个要作为选项卡才有)
android:entries 弹出的对话框中,列表显示的文本内容,需要指定的是一个数组。
android:entryValues 与android:entries相对应的值
android:defaultValue 当对应值不存在时的默认值
android:dialogTitle 弹出的对话框中的标题信息
注意点:
android:entries和android:entryValues数组的创建:
在values文件夹中创建:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="entries">
<item>Java</item>
<item>Swift</item>
<item>C#</item>
</string-array>
<string-array name="values">
<item>Eclipse</item>
<item>Xcode</item>
<item>Visual Studio</item>
</string-array>
</resources>
2.PreferenceFragment
新建MyPreferenceFragment,继承于PreferenceFragment,并加载选项设置的布局文件:
public class MyPreferenceFragment extends PreferenceFragment {
private CheckBoxPreference checkBoxPreference;
private EditTextPreference editTextPreference;
private ListPreference listPreference;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.myperference);
checkBoxPreference = (CheckBoxPreference)
findPreference("checkbox");
editTextPreference = (EditTextPreference) findPreference("text");
listPreference = (ListPreference) findPreference("list");
}
}
在MainActivity.java中加载上面的Fragment:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);‘
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
MyPreferenceFragment fragment = new MyPreferenceFragment();
transaction.add(R.id.container, fragment);
transaction.commit();
}
}
3.监听事件onPreferenceTreeClick()方法:
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
Preference preference) {
// TODO Auto-generated method stub
if ("checkbox".equals(preference.getKey())) {
Log.i("checkbox", "lalalal");
}
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
当任何一个preference控件被点击,都将触发该方法。但是可以通过preference.getKey()这个方法找到具体是哪个preference被点击了,因为每个preference的key都是唯一的。