当前位置: 代码迷 >> Android >> Android开发12:Preference格局结构小议
  详细解决方案

Android开发12:Preference格局结构小议

热度:92   发布时间:2016-05-01 18:05:03.0
Android开发12:Preference布局结构小议

                                                                 Preference布局结构小议

     安卓程序开发中常用Preference布局结构来做程序的设置项。Android系统会将Preference元素的值存储在sharedPreference文件中,方便了数据的管理。该文件存放路径位DDMS视图下data/data/[packgename]/shared_prefs/文件下,命名约定为:packagename_preferencse.xml。Preference的优点在于布局界面的可控性和高效率以及可存储值的简洁性。

      获取preferences可以通过三种方式:
       一、getPreferences():可以获取同一activity中的preference;
       二、getSharedPreferences():可以获取映用级别的preferences(),在这个例子中由于我们封装在同一app中,也可以使用SharePreferences prefs = getSharedPreferences("com.wei.android.learning_preferences" ,0);其中第一个参数name的格式是<package_name>_preferences;
       三、getDefaultSharedPreferences():

    Preference的Activity继承PreferenceActivity,然后在onCreate()方法中通过addPreferencesFromResource(R.xml.custom_preference) (我们自定义的Preference 布局)。

  Preference元素的通用XML Attributes说明:    

android:key : 每个Preference控件独一无二的”ID”,唯一表示此Preference。          

android:defaultValue : 默认值。 例如,CheckPreference的默认值可为”true”,默认为选中状态;ditTextPreference的默认值可为”110” 。

android:enabled :表示该Preference是否可用状态。     

android:title :每个Preference在PreferenceScreen布局上显示的标题——大标题

 android:summary : 每个Preference在PreferenceScreen布局上显示的标题——小标题(可以没有)

 android:persistent:表示Preference元素所对应的值是否写入sharedPreferen文件中,如果是true,则表示写入;否则,则表示不写入该Preference元素的值。

android:dependency:表示一个Preference(用A表示)的可用状态依赖另外一个Preference(用B表示)。B可用,则A可用;B不可用,则A不可用。

android:disableDependentsState:与android:dependency相反。B可用,则A不可用;B不可用,则A可用。

常用的方法则包括:  getKey()        setKey()

                              getSummary()        setSummary()

                              getText()        setText()

重点:分析Preference事件

 

   PreferenceActivity方法中,一个比较重要的监听点击事件方法为:

             publicbooleanonPreferenceTreeClick(PreferenceScreen preferenceScreen,Preference preference)          

 说明:当Preference控件被点击时,触发该方法。

 参数说明: preference  点击的对象。

返回值:   true  代表点击事件已成功捕捉,无须执行默认动作或者返回上层调用链。例如,不跳转至默认Intent。false 代表执行默认动作并且返回上层调用链。例如,跳转至默认Intent。

     在我们继承PreferenceActivity的Activity可以重写该方法,来完成我们对Preference事件的捕捉。

Preference相关的两个重要监听接口。

   1Preference.OnPreferenceChangeListener     该监听器的一个重要方法如下:

        boolean onPreferenceChange(Preference preference,Object objValue)

 说明:  当Preference的元素值发送改变时,触发该事件。

返回值:true  代表将新值写入sharedPreference文件中。false 则不将新值写入sharedPreference文件

  2 Preference.OnPreferenceClickListener。该监听器的一个重要方法如下:

      publicbooleanonPreferenceClick(Preference preference)

说明:当点击控件时触发发生,可以做相应操作。

 那么当一个Preference控件实现这两个接口时,当被点击或者值发生改变时,触发方法是如何执行的呢?事实上,

 它的触发规则如下:

      1 先调用onPreferenceClick()方法,如果该方法返回true,则不再调用onPreferenceTreeClick方法 ;

              如果onPreferenceClick方法返回false,则继续调用onPreferenceTreeClick方法。

          2 onPreferenceChange的方法独立与其他两种方法的运行。也就是说,它总是会运行。

下面写个小例子描述下具体实现步骤:

1在res下建立xml文件夹,并在内建立Preference.xml文件。PreferenceScreen是根节点。

<?xmlversion="1.0"encoding="utf-8"?>

<PreferenceScreenxmlns:android="http://schemas.android.com/apk/res/android"

    android:title="@string/preferences">

 

   <PreferenceScreen

       android:key="version"

       android:title="@string/about">

   </PreferenceScreen>

 

   <PreferenceScreen

       android:key="general"

       android:title="@string/settings">

 

       <CheckBoxPreference

           android:key="auto_start"

           android:title="@string/auto_start"/>

 

       <CheckBoxPreference

           android:key="keep_screen_on"

           android:summary="@string/keep_screen_on_summary"

           android:title="@string/keep_screen_on"/>

 

       <CheckBoxPreference

           android:key="general_show_icon_in_status_bar"

           android:title="@string/show_icon_in_status_bar" />

   

       <PreferenceScreen

           android:key="font"

           android:title="@string/fonts">

       </PreferenceScreen>

      <ListPreference 

           android:key="start_display" 

           android:title="@string/start_display" 

          android:summary="Select an option"

          android:entries="@array/start_display"

          android:entryValues="@array/start_display_entries"

          android:dialogTitle="@string/start_display_title"/> 

    </PreferenceScreen>

 </PreferenceScreen>

2在src下建立java文件Preference.java并继承PreferenceActivity。部分结构代码:

publicvoid onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.preferences);

       fonts = (PreferenceScreen) findPreference("font");

      startDisplay=(PreferenceScreen)findPreference("start_display");

      setFilePath = (PreferenceScreen) findPreference("SetFilePath");

       setVolume =(PreferenceScreen) findPreference("SetVolume");

}

3Preference.java中写事件。可以用Preference的内置控件,也可以在PreferenceScreen中写单击事件。

publicboolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,

          Preference preference) {

       if (preference ==version) { // 版本号

          DialogAdapter dialogadapter = new DialogAdapter(this);

          dialogadapter.showTipsDialog();

      } elseif (preference ==autoStart) { // 开机自启动事件

          editor.putBoolean(AUTO_START_STATUS,autoStart.isChecked());

          editor.commit();

      } elseif (preference ==keepScreenOn) {// 保持屏幕

          editor.putBoolean(KEEP_SCREEN_ON,keepScreenOn.isChecked());

          editor.commit();

          if (keepScreenOn.isChecked()){

             AlarmAlertWakeLock.acquireScreenWakeLock(this);

          } else {

             AlarmAlertWakeLock.release();

          }

       }

returnsuper.onPreferenceTreeClick(preferenceScreen, preference);

    }

看效果:

 

疑问

         在用listPreference中点击listPreference就开始把上次设置的数据保存在sharePreference中,然而在弹出Listdialog选择时却不会保存,不知道为什么?都最后只能放弃listPreference,自己写事件获得数据。请高人指点!

  相关解决方案