[关闭]
@XiangZhou 2015-08-01T01:23:04.000000Z 字数 2946 阅读 2158

android中的Settings

android settings preference


这个星期,妹子被安排学习android中Settings App的学习,其实我开发工作类似于android的framework的开发,对上层的UI不是很熟悉,可是没办法,硬着头皮上。
这个我看的android是4.0以上的,其系统实现的settings app是使用的header+fragment来实现的,就是程序启动的Activity中的那些项目是一个一个的header,你和一个一个的fragment是一一对应的,点击header就会使用这个fragment来替换当前activity的content,来实现这个项目的设置项,那么先来看怎么来定义header和fragment之间的对应关系。
header和fragment的对应关系定义可以通过一个xml文件来描述,如下:

  1. <preference-headers xmlns:android="http://schemas.android.com/apk/res/android" >
  2. <header
  3. android:id="@+id/wlan"
  4. android:fragment="com.example.settings.WlanSettingsFragment"
  5. android:icon="@drawable/ic_settings_wifi"
  6. android:title="@string/wlan" />
  7. </preference-headers>

我们定义一个header,我们可以指定其各项的属性,最关键的是fragment这个参数,其就是点击这个header后跳转到的这个fragment,我们这个是WlanSettingsFragment
我们为了提供一些灵活性,做了一个基类SettingsFragment,其定义如下:

  1. public class SettingsFragment extends PreferenceFragment {
  2. public void onCreate(Bundle icicle) {
  3. super.onCreate(icicle);
  4. }
  5. }

PreferenceFragment可以用来显示各个Preference.
WlanSettingsFragment继承至SettingsFragment,如下:

  1. public class WlanSettingsFragment extends SettingsFragment {
  2. public void onCreate(Bundle icicle) {
  3. super.onCreate(icicle);
  4. addPreferencesFromResource(R.xml.wlan_settings);
  5. }
  6. }

关系这个Fragment我们需要显示怎么样的preference,我们可以使用xml文件来加载。
一个fragment的preference描述如下:

  1. <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
  3. android:title="@string/wlan" >
  4. <Preference
  5. style="?android:preferenceInformationStyle"
  6. android:key="kernel_version"
  7. android:summary="@string/device_info_default"
  8. android:title="@string/kernel_version" />
  9. <CheckBoxPreference
  10. android:key="wlan"
  11. android:title="@string/wlan" />
  12. </PreferenceScreen>

preference可以自动的使用SharePreferences完成数据的保存,其保存的形式是一个键值对形式,那么这个key就是在描述preference中的android:key的值。

下面一步就是启动Activity,为了显示header,我们继承PreferenceActivity类实现我们的主Activity。如下:

  1. public class SettingsActivity extends PreferenceActivity {
  2. @Override
  3. public void onBuildHeaders(List<Header> target) {
  4. loadHeadersFromResource(R.xml.settings_headers, target);
  5. }
  6. @Override
  7. protected boolean isValidFragment(String fragmentName) {
  8. // TODO Auto-generated method stub
  9. if (fragmentName.equals("com.example.settings.WlanSettingsFragment")) {
  10. return true;
  11. }
  12. return false;
  13. }
  14. }

开始看google的开发文档,原文如下:


Note: When using preference headers, your subclass of PreferenceActivity doesn't need to implement
the onCreate() method, because the only required task for the activity is to load the headers.


就是你只要在onBuildHeaders方法中,加载你定义的headers文件就ok了,可是在我的4.4.2的手机上就是运行不起来,好吧,然后看了手机的崩溃报告,说一定要实现isValidFragment这个方法,判断一下header中的fragment的参数是否是正确的。
然后就运行起来了。

然后为了响应一些preference的点击啊,状态改变啊,我们可以通过findPreference在fragment中找出在xml定义的preference,这个函数的参数就是在xml文件中定义的android:key的值。然后我们可以给它添加操作。
如下:

  1. SwitchPreference wifiopen = (SwitchPreference) findPreference("wifi_open");
  2. wifiopen.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
  3. public boolean onPreferenceChange(Preference preference, Object newValue) {
  4. // TODO Auto-generated method stub
  5. boolean open = (boolean) newValue;
  6. if (open) {
  7. openwifi();
  8. } else {
  9. closewifi();
  10. }
  11. return true;
  12. }
  13. });

今天就到这里吧,这些只是最基础的了。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注