您的位置:首页 > 移动开发 > Android开发

Android开发--详解SharedPreference/PreferenceActivity

2013-01-19 19:42 471 查看
我们经常看到应用程序的设置页面,一般用到设置页面时,我们会继承自PreferenceActivity,它实现了SharedPreference,并生成相应的XML文件自动保存用户的设置,在设置页面中,每一个列表项都是一个Preference,如果要实现点击某一项有所反应,就需要实现OnPreferenceChangeListener接口,并使得某一个Preference绑定一个监听器,下面的截图是作者实现的一个设置界面:



实现这个界面的XML文件如下:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory  android:title="我的设置">
    <!-- 此外,还有一个控件为,ListPreference,单击该控件会弹出一个带ListView的对话框 -->
    <!-- 该控件相当于CheckBox -->
        <CheckBoxPreference android:key="wireless_network"
            android:title="使用无线网络"
            android:summary="使用无线网络查看应用程序(例如Google地图)中的位置"/>
          <CheckBoxPreference android:key="gps_satellite_setting"
            android:title="启用GPS卫星设置"
            android:summary="定位时,精确到街道级别(取消选择可节约电量)"/>
</PreferenceCategory>
    
<PreferenceCategory  android:title="个人信息设置">
         <CheckBoxPreference android:key="yesno_save_info"
            android:title="是否保存个人信息"/>
         <!-- 单击该控件会弹出一个带EditText的对话框 -->
         <EditTextPreference android:key="individual_name"
             android:title="姓名" android:summary="请输入真实姓名"/>
        <!-- 这是一个子设置页面,但是如果如在代码中设置,打开后是黑色的背景,看不到内容 --> 
    <PreferenceScreen android:key="other_individual_msg"
             android:title="其他个人信息" android:summary="是否工作,手机">
              <CheckBoxPreference android:key="is_an_employee"
            android:title="是否工作"/>
         <EditTextPreference android:key="mobile"
             android:title="手机" android:summary="请输入真实的手机号"/>
     </PreferenceScreen>
         
</PreferenceCategory>

</PreferenceScreen>


其中实现相应的功能,功能的实现代码都有相应的注释:

public class SharedActivity extends PreferenceActivity implements OnPreferenceChangeListener{

	@SuppressWarnings("deprecation")
	@Override
	/*
	 *在onCreate方法中需要做一下几点工作
	 *1.修改PreferenceActivity保存数据使用的XML文件的名称,在默认情况下,保存key-value对的XML文件是<package_name>_preferences.xml
	 *在本例中我将这些键值对保存才setting中
	 *2.设置”姓名“列表项是否可用
	 *3.每一个列表项就是一个Preference对象,要实现单击响应,就必须要绑定响应的监听器
	 */
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//改变PreferenceActivity保存数据使用的XML文件的名称
		getPreferenceManager().setSharedPreferencesName("setting");
		//不需要设置布局文件,只需要使用如下的代码装载xml文件即可
		addPreferencesFromResource(R.xml.activity_shared);
		
		Preference individualNamePreference=findPreference("individual_name");
		//获得指向setting.xml文件的SharedPreference对象
		SharedPreferences sharedPreferences=individualNamePreference.getSharedPreferences();
		//设置姓名列表项的Summary
		individualNamePreference.setSummary(sharedPreferences.getString("individual_name", "请输入真实姓名"));
		
		Preference mobilePreference=findPreference("mobile");
		SharedPreferences sharedPreferences2=mobilePreference.getSharedPreferences();
		mobilePreference.setSummary(sharedPreferences2.getString("mobile", "请输入真实的手机号码"));
		//设置“姓名”列表项是否可用
		if(sharedPreferences.getBoolean("yesno_save_info", false)){
			individualNamePreference.setEnabled(true);
		}
		else {
			individualNamePreference.setEnabled(false);
		}
		individualNamePreference.setOnPreferenceChangeListener(this);
		mobilePreference.setOnPreferenceChangeListener(this);
		/*
		 * 在Preference中设置使用Theme.Light主题,则打开Preference为白色主题, 
		 * 当Preference中内嵌有其他PreferenceScreen的时候, 
		 * 打开内嵌的PreferenceScreen则屏幕背景为黑色的.
		 * 下面的这个方法实现的是:
		 * 在打开内嵌PreferenceScreen的时候设置其背景色.
		 */
		PreferenceScreen s= (PreferenceScreen) findPreference("other_individual_msg");  
		s.setOnPreferenceClickListener(new OnPreferenceClickListener() {  
		 @Override  
		 public boolean onPreferenceClick(Preference preference) {  
		  PreferenceScreen a = (PreferenceScreen) preference;  
		  a.getDialog().getWindow().  
		  setBackgroundDrawableResource(android.R.drawable.screen_background_light);  
		  return false;  
		  }  
		 }); 
	}
	@SuppressWarnings("deprecation")
	@Override
	public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
			Preference preference) {
		if("yesno_save_info".equals(preference.getKey())){
			findPreference("individual_name").setEnabled(!findPreference("individual_name").isEnabled());
		}
		// TODO Auto-generated method stub
		return super.onPreferenceTreeClick(preferenceScreen, preference);
	}
	/*
	 * 必须要实现OnPreferenceChangeListener接口,该回调函数的功能是捕获列表项中的值改变后的情况
	 * @see android.preference.Preference.OnPreferenceChangeListener#onPreferenceChange(android.preference.Preference, java.lang.Object)
	 */
	@Override
	public boolean onPreferenceChange(Preference preference, Object newValue) {
		// TODO Auto-generated method stub
		preference.setSummary(String.valueOf(newValue));
		//一定要返回true,否则列表项的值不会改变
		return true;
	}
	
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐