Android Preference制作setting菜单数据处理

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


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


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


我们先来编辑布局文件setting_demo.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <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>  


  • 其中的字符串定义:
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <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中加入下面一句话就可以看到效果了
    1. public class SettingDemo extends PreferenceActivity {  
    2.     /** Called when the activity is first created. */  
  •     @Override  
  •     public void onCreate(Bundle savedInstanceState) {  
  •         super.onCreate(savedInstanceState);  
  •           
  •         addPreferencesFromResource(R.xml.setting_demo);  
  •     }  
  •   
  •       
  • }  


  • 效果如下图所示,根据效果图大家很容易的理解布局文件中的各个标签的用途了

三.“深入了解”
现在我们点击设置中的选项还没有实质的效果,首先我们先来了解一下设置中的CheckBox控件
  1. private static final String CHECK_BOX_PRE = "check_box";//和xml中的key值对应   
  2. private CheckBoxPreference mCheckBoxPre; //声明一个用来控制checkbox的对象   
  3.   
  4. mCheckBoxPre = (CheckBoxPreference) findPreference(CHECK_BOX_PRE);//findPreference通过在xml中控件的key值找到该控件   
  5.   
  6. <CheckBoxPreference   
  7.               
  8.             android:key="check_box"  
  9.             android:title="@string/title_check_box" android:summary="@string/summary_check_box"  
  10.             android:persistent="false" />  
  11.   
  12.   
  13. mCheckBoxPre.setOnPreferenceChangeListener(this);//设置监听器   
  14.   
  15. 我们将在onPreferenceChange中处理设置变化时的操作  
详细代码如下:
  1. public class SettingDemo extends PreferenceActivity implements  
  2.         OnPreferenceChangeListener {  
  3.   
  4.     private static final String CHECK_BOX_PRE = "check_box";  
  5.   
  6.     private CheckBoxPreference mCheckBoxPre;  
  7.   
  8.     /** Called when the activity is first created. */  
  9.     @Override  
  10.     public void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         addPreferencesFromResource(R.xml.setting_demo);  
  13.   
  14.         mCheckBoxPre = (CheckBoxPreference) findPreference(CHECK_BOX_PRE);  
  15.         mCheckBoxPre.setOnPreferenceChangeListener(this);  
  16.   
  17.     }  
  18.       
  19.     @Override  
  20.     public boolean onPreferenceChange(Preference preference, Object newValue) {  
  21.         // TODO Auto-generated method stub   
  22.         if (preference.getKey().equals(CHECK_BOX_PRE)) {  
  23.             mCheckBoxPre.setChecked((Boolean) newValue);  
  24.             mCheckBoxPre.setSummary((Boolean) newValue ? "checked"  
  25.                     : "unchecked");  
  26.             doSomething((Boolean) newValue ? 1 : 0);  
  27.         }  
  28.         return false;  
  29.     }  
  30.   
  31.       
  32.   
  33.     private void doSomething(int i) {  
  34.         // TODO Auto-generated method stub   
  35.         if (i == 1) {  
  36.             Toast.makeText(this"checked!", Toast.LENGTH_SHORT).show();  
  37.         } else if (i == 0) {  
  38.             Toast.makeText(this"unchecked!", Toast.LENGTH_SHORT).show();  
  39.         }  
  40.   
  41.     }  
  42.   
  43. }  
运行起来看看效果吧!

在程序中我们也可以动态的控制设置中内容的显示

 

 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>

posted @ 2013-09-28 13:20  MMLoveMeMM  阅读(579)  评论(0)    收藏  举报