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;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>