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的布局就能實作。