android5.1的Settings相对于4.4界面上改善了不少,使用了ToggleSwitch,整体风格改为Light。新增了一些功能:屏幕投影,反色,搜索设置项等。本文简单介绍5.1的Settings,列举一些常见的修改。帮助大家快速入门。
虽然增加一些功能但架构没有太大变化,还是使用PreferenceFragment。主要改变在Settings的首页不再使用PreferenceActivity。
从AndroidManifest.xml可以很快找到首页SettingsActivity.java这个界面,只是继承了普通的Activity。
查看setContentView的布局但没有发现有内容加载
setContentView(mIsShowingDashboard ?
R.layout.settings_main_dashboard : R.layout.settings_main_prefs);
继续查找可以看到如下方法,采用了跟4.4类似的方法将布局放到xml里面。5.1的xml叫dashboard_categories,而4.4叫settings_headers。相对来说功能简单了很多,只能跳转到相应的PreferenceFragment。
/**
* Called when the activity needs its list of categories/tiles built.
*
* @param categories The list in which to place the tiles categories.
*/
private void buildDashboardCategories(List<DashboardCategory> categories) {
categories.clear();
loadCategoriesFromResource(R.xml.dashboard_categories, categories);
updateTilesList(categories);
}
一般都会对其做简单的增删操作,如果直接删除xml上的项目会引起很多findViewById的报错,所以最好调用常规流程删除,updateTilesList( )这个方法里提供了参考。直接找到id设为removeTile=true就可以了。
...
else if (id == R.id.print_settings) {
boolean hasPrintingSupport = getPackageManager().hasSystemFeature(
PackageManager.FEATURE_PRINTING);
if (!hasPrintingSupport) {
removeTile = true;
}
}
...
PreferenceFragment的项目删除跟以上类似,从dashboard_categories.xml里找到对应的fragment在onCreate( )方法后直接删除就可以了。找到对于的父容器(PreferenceCategory),调用removePreference就可以了,如果没有父容器就直接removePreference,例如在NotificationSettings.java里删除一些设置项。
sound.removePreference(findPreference(KEY_RING_VOLUME));
sound.removePreference(findPreference("zen_mode"));
notification.removePreference(mLockscreen);
settings的默认值在5.1里没有变化,大部分默认设置还是在SettingsProvider下的defaults.xml里找到初始化。还有些设置项的属性为android:persistent="false"。说明要自己实现持久化,设置项的Preference由对应的service维护,比如wifi的设置项。这时默认值大多在framework/base/core/res/res/value/strings.xml或bools.xml或integers.xml下能找到。
android5.1对settings的修改使以后自定义settings界面变得更容易了,重写DashboardSummary.java的这个fragment的布局就能实现。