android设置界面preferences的使用

部分借鉴:http://blog.csdn.net/flowingflying/article/details/6671548,谢谢作者

步骤1:编写preference XML,在res/xml/下加入我们的preference XML文件,例如名字叫preference.xml(不是上图的布局文件)

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <PreferenceScreen
 3     xmlns:android="http://schemas.android.com/apk/res/android">
 4     
 5     <PreferenceCategory android:title="消息通知"> 
 6         <CheckBoxPreference android:title="开启声音" android:key="开启声音" android:summary="当有新消息通知时播放声音提示" android:defaultValue="true" />
 7         <CheckBoxPreference android:title="开启震动" android:key="开启震动" android:summary="当有新消息通知时震动提示" android:defaultValue="true" />    
 8     </PreferenceCategory>
 9     
10     <PreferenceCategory android:title="图片接收">    
11         <CheckBoxPreference android:title="自动接收图片" android:key="自动接收图片" android:summary="GPRS,3G网络下自动接收并显示图片" android:defaultValue="false" />       
12     </PreferenceCategory>
13     
14     <PreferenceCategory android:title="显示" >  
15         <CheckBoxPreference android:title="开启横屏模式" android:key="开启横屏模式" android:defaultValue="true" />
16         <CheckBoxPreference android:title="显示系统栏挂机图标" android:key="显示系统栏挂机图标" android:summary="后台运行时,在系统栏显示程序图标" android:defaultValue="true" />
17         <PreferenceScreen android:title="更换皮肤">
18             <intent android:targetPackage="com.genius.demo" android:targetClass="com.genius.demo.SkinActivity" />
19         </PreferenceScreen>
20     </PreferenceCategory>
21     
22     <PreferenceCategory android:title="辅助功能">
23         <CheckBoxPreference android:title="开启截屏功能" android:key="开启截屏功能" android:summary="摇晃手机即可截图(在QQ外截图需root权限)" android:defaultValue="false" />
24         <CheckBoxPreference android:title="上报我的地理位置" android:key="上报我的地理位置" android:summary="上报地理位置信息以便附近的人能够找到我" android:defaultValue="false" />
25         <PreferenceScreen android:title="查看流量统计" android:summary="使用手机QQ所产生的上行和下行流量">
26             <intent android:targetPackage="com.genius.demo" android:targetClass="com.genius.demo.TrafficStatActivity" />
27         </PreferenceScreen>
28 
29     </PreferenceCategory>
30     
31     <PreferenceCategory android:title="帮助">
32         <PreferenceScreen android:title="反馈建议" android:summary="反馈建议">
33             <intent android:action="android.intent.action.VIEW" android:data="http://wap.3g.qq.com/g/s?aid=wapsupport&amp;amp;fid=647" />
34         </PreferenceScreen>
35         <PreferenceScreen android:title="好友设置" android:summary="好友设置">
36             <intent android:targetPackage="com.genius.demo" android:targetClass="com.genius.demo.FriendInfoActivity" />
37         </PreferenceScreen>
38     </PreferenceCategory>
39 </PreferenceScreen>

步骤2:在java源代码中调用该xml,生成相应的preference界面,同时可设置对应的监听操作,例如分享、自动加载更多等

  1 package com.maomao.beautymovie;
  2 
  3 
  4 
  5 import android.app.ActionBar;
  6 import android.content.Intent;
  7 import android.os.Bundle;
  8 import android.preference.CheckBoxPreference;
  9 import android.preference.Preference;
 10 import android.preference.Preference.OnPreferenceChangeListener;
 11 import android.preference.Preference.OnPreferenceClickListener;
 12 import android.preference.PreferenceActivity;
 13 import android.view.MenuItem;
 14 import android.widget.Toast;
 15 
 16 public class SettingActivity extends PreferenceActivity implements OnPreferenceClickListener,OnPreferenceChangeListener{
 17 
 18     protected ActionBar mActionBar;
 19     private Preference pref_share;
 20     private CheckBoxPreference autoLoad_cbox;
 21     @SuppressWarnings("deprecation")
 22     protected void onCreate(Bundle savedInstanceState) {
 23         super.onCreate(savedInstanceState);
 24         
 25         // Load the preferences from an XML resource
 26         
 27  
 28         initActionBar();
 29         addPreferencesFromResource(R.xml.setting_preference);
 30         
 31         autoLoad_cbox = (CheckBoxPreference) findPreference("autoload");
 32         /**
 33          * Preference分享操作
 34          */
 35         pref_share=(Preference) findPreference("pref_share");
 36         pref_share.setOnPreferenceClickListener(this);
 37         autoLoad_cbox.setOnPreferenceChangeListener(this);
 38         
 39         
 40     }
 41 
 42     
 43     
 44     private void initActionBar() {
 45         mActionBar = getActionBar();
 46         mActionBar.setDisplayHomeAsUpEnabled(true);             // 给左上角图标的左边加上一个返回的图标"《" 。对应ActionBar.DISPLAY_HOME_AS_UP
 47         mActionBar.setDisplayShowHomeEnabled(true);             //使左上角图标可点击,对应id为android.R.id.home,对应ActionBar.DISPLAY_SHOW_HOME false 则图标无法点击
 48         mActionBar.setHomeButtonEnabled(true);                  // false 就无法点击
 49     }
 50     
 51     @Override
 52     public boolean onOptionsItemSelected(MenuItem item) {
 53         if (item.getItemId() == android.R.id.home) {
 54             finish();
 55             return true;
 56         }
 57         return super.onOptionsItemSelected(item);
 58     }
 59 
 60 
 61     
 62 //    
 63 //    mCheckbox0.setOnPreferenceClickListener(new OnPreferenceClickListener() {
 64 //        @Override
 65 //        public boolean onPreferenceClick(Preference preference) {
 66 //            //这里可以监听到这个CheckBox 的点击事件
 67 //            return true;
 68 //        }
 69 //        });
 70 //    mCheckbox0.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
 71 //        @Override
 72 //        public boolean onPreferenceChange(Preference arg0, Object newValue) {
 73 //            //这里可以监听到checkBox中值是否改变了
 74 //            //并且可以拿到新改变的值
 75 //            Toast.makeText(mContext, "checkBox_0改变的值为" + (Boolean)newValue, Toast.LENGTH_LONG).show();
 76 //            return true;
 77 //        }
 78 //    });
 79 //    
 80     
 81     
 82     
 83     
 84     /**
 85      * on share item click
 86      */
 87     public void onClickShare() {
 88         Intent intent = new Intent(Intent.ACTION_SEND);
 89         intent.setType("text/plain");
 90         intent.putExtra(Intent.EXTRA_SUBJECT, "分享");
 91         intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.share_text));
 92         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 93         startActivity(Intent.createChooser(intent, getTitle()));
 94     }
 95 
 96     @Override
 97     public boolean onPreferenceClick(Preference preference) {
 98         // TODO Auto-generated method stub
 99         if(preference == pref_share){
100             onClickShare();
101             return true;
102         }
103      return false;
104     }
105 
106 
107 
108     @Override
109     public boolean onPreferenceChange(Preference preference, Object newValue) {
110         if(preference == autoLoad_cbox){
111           //这里可以监听到checkBox中值是否改变了
112           //并且可以拿到新改变的值
113           Toast.makeText(this, "自动加载更多:" + (Boolean)newValue, Toast.LENGTH_SHORT).show();
114           return true;
115         }
116         return false;
117     }
118     
119     
120     
121 }

和用layout方式一样,代码很简单。和以往界面最大的区别是,我们对checkbox进行选择或者对ringtone进行选择后,这个选择结果是被保留的,当我们退出actitvity后再次进入,上次的选项依然保留,我们重新向模拟器load应用,发现之前的选项仍然存在。我们可以利用preference,而无须人工对数据进行保存和读取,很是方便。

步骤3:获取preference的数据

处了在preference的界面中可以保留数据,我们也希望能够读出数据,以便这些数据可以用在其他的activity中。如果另一个activity和这些数据关联,而且希望能够实时进行同步,在onResume()中对preference保留的数据进行读取,而后进行相关的更新。

首先要获取preferences,然后通过键值对的获取方式根据key获取数值,在xml中checkbox的key为“checkbox”,值的类型为布尔值,而rintong的值为String,例如:

1    protected void onResume() { //在另一个Activity中
2         super.onResume();
3         SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ;
4         System.out.println(new Boolean(prefs.getBoolean("checkbox",false)).toString());//false表示没有查到checkbox这个key的返回值
5         System.out.println(prefs.getString("ringtone","<unset>"));//<unset>表示没有查到ringtong这个key的返回值
6     }

or:

1     @Override
2     public void onResume() {
3         SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(getActivity());
4         movieListView.setAutoLoadMore(prefs.getBoolean("autoload",false));
5         super.onResume();
6     }

PreferenceCategory也可以嵌套PreferenceScreen,PreferenceScreen中的内容,将通过另一屏来显示,我们在上面例子后面添加一个嵌套了PreferenceScreen的PreferenceCategory。整个PreferenceScreen作为一个组件出现,点击后新的一屏,由入PreferenceScreen定义。通过这个关系,我们可以组织自己的preference架构。

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
 3        <PreferenceCategory android:title="Simple Preferences">
 4             <CheckBoxPreference android:key="checkbox" ..../>
 5             <RingtonePreference android:key="ringtone" ... />
 6        </PreferenceCategory>
 7        <PreferenceCategory android:title="Detail Screens">
 8            <PreferenceScreen android:title="Detail"
 9                android:summary="Addtional preference help in another page">
10                <CheckBoxPreference android:key="checkbox2"
11                    android:title="Another Checkbox"
12                    android:summary="On or Off, It's a problem...."/>
13            </PreferenceScreen>
14        </PreferenceCategory>
15 </PreferenceScreen>
原文地址:https://www.cnblogs.com/ning1121/p/4378289.html