android中的Settings
2015-08-01 09:22
645 查看
android中的Settings
这个星期,妹子被安排学习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" /> <SwitchPreference android:key="wifi_open" android:title="@string/wifi_enable" android:defaultValue="false" /> </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; } });
今天就到这里吧,这些只是最基础的了。
相关文章推荐
- android获取控件宽度高度
- Android Service 知识点总结
- Android如何获取选择图片时的文件绝对路径方法
- 【android控件学习笔记】ListView
- listview android:cacheColorHint,android:listSelector属性作用
- Android Adapter 异步图片请求诡异问题
- Android配置opencv开发环境并运行face-detection 人脸检测例程
- Android NDK的入门程序 FATAL EXCEPTION
- 【攻克Android (13)】Menu 菜单
- Android IntentService完全解析
- Android Studio 下混淆 文件配置 问题 初探(一)
- android之sqlite简单使用
- android-样式(style)和主题(theme)
- Android ListView滑动过程中图片显示重复错位闪烁问题解决
- Android:控件属性
- 【Android】PhoneMonitor 手机监控器
- Android开发记录20-获取缓存大小和清除缓存功能
- Android学习笔记之Intent
- Android 开发新特性
- android 开源框架xUtils