@XiangZhou
2015-08-01T09:23:04.000000Z
字数 2946
阅读 2305
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文件来描述,如下:
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android" >
<header
android:id="@+id/wlan"
android:fragment="com.example.settings.WlanSettingsFragment"
android:icon="@drawable/ic_settings_wifi"
android:title="@string/wlan" />
</preference-headers>
我们定义一个header,我们可以指定其各项的属性,最关键的是fragment
这个参数,其就是点击这个header后跳转到的这个fragment,我们这个是WlanSettingsFragment
。
我们为了提供一些灵活性,做了一个基类SettingsFragment
,其定义如下:
public class SettingsFragment extends PreferenceFragment {
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
}
}
PreferenceFragment
可以用来显示各个Preference
.
WlanSettingsFragment
继承至SettingsFragment
,如下:
public class WlanSettingsFragment extends SettingsFragment {
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
addPreferencesFromResource(R.xml.wlan_settings);
}
}
关系这个Fragment我们需要显示怎么样的preference,我们可以使用xml文件来加载。
一个fragment的preference描述如下:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
android:title="@string/wlan" >
<Preference
style="?android:preferenceInformationStyle"
android:key="kernel_version"
android:summary="@string/device_info_default"
android:title="@string/kernel_version" />
<CheckBoxPreference
android:key="wlan"
android:title="@string/wlan" />
</PreferenceScreen>
preference可以自动的使用SharePreferences完成数据的保存,其保存的形式是一个键值对形式,那么这个key就是在描述preference中的android:key的值。
下面一步就是启动Activity,为了显示header,我们继承PreferenceActivity类实现我们的主Activity。如下:
public class SettingsActivity extends PreferenceActivity {
@Override
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.settings_headers, target);
}
@Override
protected boolean isValidFragment(String fragmentName) {
// TODO Auto-generated method stub
if (fragmentName.equals("com.example.settings.WlanSettingsFragment")) {
return true;
}
return false;
}
}
开始看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的值。然后我们可以给它添加操作。
如下:
SwitchPreference wifiopen = (SwitchPreference) findPreference("wifi_open");
wifiopen.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
// TODO Auto-generated method stub
boolean open = (boolean) newValue;
if (open) {
openwifi();
} else {
closewifi();
}
return true;
}
});
今天就到这里吧,这些只是最基础的了。