Android Preference制作setting菜单数据处理
一.“初次邂逅”
我们构建的应用程序经常会需要一个设置界面,用来设置应用程序的各个参数,就如同Android系统本身的设置界面一样。
Android中提供了专门的方法来构建自己的设置界面

二.“先看外表”
首先创建一个项目

在工程的res目录下添加xml文件夹,并添加构建设置界面的xml文件

我们先来编辑布局文件setting_demo.xml
- <?xml version="1.0" encoding="utf-8"?>
- <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- android:key="setting_demo_preference" android:title="@string/title_setting_demo_preference"
- android:summary="@string/summary_setting_demo_preference">
- <PreferenceCategory xmlns:android="http://schemas.android.com/apk/res/android"
- android:key="common_settings" android:title="@string/common_settings">
- <CheckBoxPreference android:key="check_box"
- android:title="@string/title_check_box" android:summary="@string/summary_check_box"
- android:persistent="false" />
- <ListPreference android:key="string_list_preference"
- android:title="@string/title_list_preference" android:summary="@string/summary_list_preference"
- android:entries="@array/entries_list_preference" android:entryValues="@array/entryvalues_list_preference"
- android:dialogTitle="@string/dialog_title_list_preference" />
- <EditTextPreference android:key="edit_text_preference"
- android:title="@string/title_edit_text_preference" android:summary="@string/summary_edit_text_preference"
- android:dialogTitle="@string/dialog_title_edit_text_preference" />
- </PreferenceCategory>
- <PreferenceCategory xmlns:android="http://schemas.android.com/apk/res/android"
- android:key="advanced_settings" android:title="@string/advanced_settings">
- <VolumePreference android:key="media_volume"
- android:title="@string/media_volume_title" android:summary="@string/media_volume_summary"
- android:dialogTitle="@string/media_volume_title" android:persistent="false"
- android:order="3" android:streamType="music" />
- <SeekBarPreference android:key="seek_bar_preference"
- android:title="@string/seek_bar_preference_title"></SeekBarPreference>
- </PreferenceCategory>
- </PreferenceScreen>
-
其中的字符串定义:
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="hello">Hello World, SettingDemo!</string>
- <string name="app_name">SettingDemo</string>
- <string name="title_setting_demo_preference">Setting Demo</string>
- <string name="summary_setting_demo_preference">setting demo summary</string>
- <string name="title_check_box">Title Check Box</string>
- <string name="summary_check_box">summary check box</string>
- <string name="title_list_preference">title_list_preference</string>
- <string name="summary_list_preference">summary_list_preference</string>
- <string name="dialog_title_list_preference">dialog_title_list_preference</string>
- <string name="title_edit_text_preference">title_edit_text_preference</string>
- <string name="summary_edit_text_preference">summary_edit_text_preference</string>
- <string name="dialog_title_edit_text_preference">dialog_title_edit_text_preference</string>
- <string name="common_settings">普通设置</string>
- <string name="advanced_settings">高级设置</string>
- <string name="media_volume_title">media_volume_title</string>
- <string name="media_volume_summary">media_volume_summary</string>
- <string name="seek_bar_preference_title">seek_bar_preference</string>
- </resources>
-
编辑完这两个文件,我们在SettingDemo.java中的onCreate中加入下面一句话就可以看到效果了
- public class SettingDemo extends PreferenceActivity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- addPreferencesFromResource(R.xml.setting_demo);
- }
- }
-
效果如下图所示,根据效果图大家很容易的理解布局文件中的各个标签的用途了
三.“深入了解”
现在我们点击设置中的选项还没有实质的效果,首先我们先来了解一下设置中的CheckBox控件
- private static final String CHECK_BOX_PRE = "check_box";//和xml中的key值对应
- private CheckBoxPreference mCheckBoxPre; //声明一个用来控制checkbox的对象
- mCheckBoxPre = (CheckBoxPreference) findPreference(CHECK_BOX_PRE);//findPreference通过在xml中控件的key值找到该控件
- <CheckBoxPreference
- android:key="check_box"
- android:title="@string/title_check_box" android:summary="@string/summary_check_box"
- android:persistent="false" />
- mCheckBoxPre.setOnPreferenceChangeListener(this);//设置监听器
- 我们将在onPreferenceChange中处理设置变化时的操作
详细代码如下:
- public class SettingDemo extends PreferenceActivity implements
- OnPreferenceChangeListener {
- private static final String CHECK_BOX_PRE = "check_box";
- private CheckBoxPreference mCheckBoxPre;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- addPreferencesFromResource(R.xml.setting_demo);
- mCheckBoxPre = (CheckBoxPreference) findPreference(CHECK_BOX_PRE);
- mCheckBoxPre.setOnPreferenceChangeListener(this);
- }
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- // TODO Auto-generated method stub
- if (preference.getKey().equals(CHECK_BOX_PRE)) {
- mCheckBoxPre.setChecked((Boolean) newValue);
- mCheckBoxPre.setSummary((Boolean) newValue ? "checked"
- : "unchecked");
- doSomething((Boolean) newValue ? 1 : 0);
- }
- return false;
- }
- private void doSomething(int i) {
- // TODO Auto-generated method stub
- if (i == 1) {
- Toast.makeText(this, "checked!", Toast.LENGTH_SHORT).show();
- } else if (i == 0) {
- Toast.makeText(this, "unchecked!", Toast.LENGTH_SHORT).show();
- }
- }
- }
运行起来看看效果吧!
在程序中我们也可以动态的控制设置中内容的显示
Preference yourSetting = findPreference(KEY_YOUR_SETTING);
getPreferenceScreen().removePreference(yourSetting );
在xml中我们也可以通过Intent来启动另外的Activity
<PreferenceScreen
android:title="@string/manageapplications_settings_title"
android:summary="@string/manageapplications_settings_summary">
<intent android:action="android.intent.action.MAIN"
android:targetPackage="com.android.settings"
android:targetClass="com.android.settings.ManageApplications" />
</PreferenceScreen>
通过指定包名和类名来启动指定的Activity
当然也可以隐式的通过指定Action来启动能接收该Intent的Activity,大家搜索Intent会找到详细的解释,这里就不累述了
<Linker : http://blog.csdn.net/u0fly/article/details/6370008>


浙公网安备 33010602011771号