Android开发 Settings源代码分析(1)
2016-06-28 15:22
567 查看
1.Android Settings源码的路径为:
android\packages\apps\Settings
2.settings主界面UI布局
Settings的启动类为:
从继承关系可以看出,Settings类继承于PreferenceActivity,因此具有Preference的一些属性和结构。
从Google settings的UI看出,左边是一些tab,右边是tab对应的内容,那么这些tab以及tab对应的内容主要是什么,以及如何显示的呢?
对于tab的显示,对应的code为:
loadHeadersFromResource(R.xml.settings_headers, headers);这个就是加载一些数据出来。
从上述xml可以看出,header的内容是通过fragment来显示,定义了每一个header对应的fragment。
下面是我显示的一些数据:
这些是我不显示的数据:
在private void updateHeaderList(List
target)函数中,会根据当前平台是否支持某项feature,决定是否显示对应的header,如果不想要那个就可以remove:
下面图片就是我显示的数据。
android\packages\apps\Settings
2.settings主界面UI布局
Settings的启动类为:
/** * Top-level settings activity to handle single pane and double pane UI layout. */ public class Settings extends PreferenceActivity implements ButtonBarHandler, OnAccountsUpdateListener {
从继承关系可以看出,Settings类继承于PreferenceActivity,因此具有Preference的一些属性和结构。
从Google settings的UI看出,左边是一些tab,右边是tab对应的内容,那么这些tab以及tab对应的内容主要是什么,以及如何显示的呢?
对于tab的显示,对应的code为:
/** * Populate the activity with the top-level headers. */ @Override public void onBuildHeaders(List<Header> headers) { if (!onIsHidingHeaders()) { loadHeadersFromResource(R.xml.settings_headers, headers); updateHeaderList(headers); } }
loadHeadersFromResource(R.xml.settings_headers, headers);这个就是加载一些数据出来。
<?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2010 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <preference-headers xmlns:android="http://schemas.android.com/apk/res/android"> <!-- WIRELESS and NETWORKS --> <header android:id="@+id/wireless_section" android:title="@string/header_category_wireless_networks" /> <!-- Wifi --> <header android:id="@+id/wifi_settings" android:fragment="com.android.settings.wifi.WifiSettings" android:title="@string/wifi_settings_title" android:icon="@drawable/ic_settings_wireless" /> <!-- Bluetooth --> <header android:id="@+id/bluetooth_settings" android:fragment="com.android.settings.bluetooth.BluetoothSettings" android:title="@string/bluetooth_settings_title" android:icon="@drawable/ic_settings_bluetooth2" /> <!-- Data Usage --> <header android:id="@+id/data_usage_settings" android:fragment="com.android.settings.DataUsageSummary" android:title="@string/data_usage_summary_title" android:icon="@drawable/ic_settings_data_usage" /> <!-- Operator hook --> <header android:fragment="com.android.settings.WirelessSettings" android:id="@+id/operator_settings"> <intent android:action="com.android.settings.OPERATOR_APPLICATION_SETTING" /> </header> <!-- Other wireless and network controls --> <header android:id="@+id/wireless_settings" android:title="@string/radio_controls_title" android:breadCrumbTitle="@string/wireless_networks_settings_title" android:fragment="com.android.settings.WirelessSettings" android:icon="@drawable/empty_icon" /> <!-- DEVICE --> <header android:id="@+id/device_section" android:title="@string/header_category_device" /> <!-- Home --> <header android:id="@+id/home_settings" android:icon="@drawable/ic_settings_home" android:fragment="com.android.settings.HomeSettings" android:title="@string/home_settings" /> <!-- Sound --> <header android:id="@+id/sound_settings" android:icon="@drawable/ic_settings_sound" android:fragment="com.android.settings.SoundSettings" android:title="@string/sound_settings" /> <!-- Display --> <header android:id="@+id/display_settings" android:icon="@drawable/ic_settings_display" android:fragment="com.android.settings.DisplaySettings" android:title="@string/display_settings" /> <!-- Storage --> <header android:id="@+id/storage_settings" android:fragment="com.android.settings.deviceinfo.Memory" android:icon="@drawable/ic_settings_storage" android:title="@string/storage_settings" /> <!-- Battery --> <header android:id="@+id/battery_settings" android:fragment="com.android.settings.fuelgauge.PowerUsageSummary" android:icon="@drawable/ic_settings_battery" android:title="@string/power_usage_summary_title" /> <!-- Application Settings --> <header android:fragment="com.android.settings.applications.ManageApplications" android:icon="@drawable/ic_settings_applications" android:title="@string/applications_settings" android:id="@+id/application_settings" /> <!-- Manage users --> <header android:fragment="com.android.settings.users.UserSettings" android:icon="@drawable/ic_settings_multiuser" android:title="@string/user_settings_title" android:id="@+id/user_settings" /> <!-- Manage NFC payment apps --> <header android:fragment="com.android.settings.nfc.PaymentSettings" android:icon="@drawable/ic_settings_nfc_payment" android:title="@string/nfc_payment_settings_title" android:id="@+id/nfc_payment_settings" /> <!-- Manufacturer hook --> <header android:fragment="com.android.settings.WirelessSettings" android:id="@+id/manufacturer_settings"> <intent android:action="com.android.settings.MANUFACTURER_APPLICATION_SETTING" /> </header> <!-- PERSONAL --> <header android:id="@+id/personal_section" android:title="@string/header_category_personal" /> <!-- Location --> <header android:fragment="com.android.settings.location.LocationSettings" android:icon="@drawable/ic_settings_location" android:title="@string/location_settings_title" android:id="@+id/location_settings" /> <!-- Security --> <header android:fragment="com.android.settings.SecuritySettings" android:icon="@drawable/ic_settings_security" android:title="@string/security_settings_title" android:id="@+id/security_settings" /> <!-- Language --> <header android:id="@+id/language_settings" android:fragment="com.android.settings.inputmethod.InputMethodAndLanguageSettings" android:icon="@drawable/ic_settings_language" android:title="@string/language_settings" /> <!-- Backup and reset --> <header android:fragment="com.android.settings.PrivacySettings" android:icon="@drawable/ic_settings_backup" android:title="@string/privacy_settings" android:id="@+id/privacy_settings" /> <!-- ACCOUNTS section --> <header android:id="@+id/account_settings" android:title="@string/account_settings" /> <header android:id="@+id/account_add" android:title="@string/add_account_label" android:icon="@drawable/ic_menu_add_dark"> <intent android:action="android.settings.ADD_ACCOUNT_SETTINGS"/> </header> <!-- SYSTEM --> <header android:id="@+id/system_section" android:title="@string/header_category_system" /> <!-- Date & Time --> <header android:id="@+id/date_time_settings" android:fragment="com.android.settings.DateTimeSettings" android:icon="@drawable/ic_settings_date_time" android:title="@string/date_and_time_settings_title" /> <!-- Accessibility feedback --> <header android:id="@+id/accessibility_settings" android:fragment="com.android.settings.accessibility.AccessibilitySettings" android:icon="@drawable/ic_settings_accessibility" android:title="@string/accessibility_settings" /> <!-- Print --> <header android:id="@+id/print_settings" android:fragment="com.android.settings.print.PrintSettingsFragment" android:icon="@*android:drawable/ic_print" android:title="@string/print_settings" /> <!-- Development --> <header android:id="@+id/development_settings" android:fragment="com.android.settings.DevelopmentSettings" android:icon="@drawable/ic_settings_development" android:title="@string/development_settings_title" /> <!-- About Device --> <header android:id="@+id/about_settings" android:fragment="com.android.settings.DeviceInfoSettings" android:icon="@drawable/ic_settings_about" android:title="@string/about_settings" /> </preference-headers>
从上述xml可以看出,header的内容是通过fragment来显示,定义了每一个header对应的fragment。
下面是我显示的一些数据:
// Show only these settings for restricted users private int[] SETTINGS_FOR_RESTRICTED = { R.id.wireless_section, R.id.wifi_settings, R.id.bluetooth_settings, R.id.data_usage_settings, R.id.wireless_settings, R.id.device_section, R.id.sound_settings, R.id.display_settings, R.id.storage_settings, R.id.application_settings, R.id.battery_settings, R.id.personal_section, R.id.location_settings, R.id.security_settings, R.id.language_settings, R.id.user_settings, R.id.account_settings, R.id.account_add, R.id.system_section, R.id.date_time_settings, R.id.about_settings, R.id.accessibility_settings, R.id.print_settings, R.id.nfc_payment_settings, R.id.home_settings };
这些是我不显示的数据:
//not show these items private int[] SETTINGS_FOR_REMOVED = { R.id.data_usage_settings, R.id.operator_settings, R.id.wireless_settings, R.id.home_settings, R.id.sound_settings, R.id.display_settings, R.id.storage_settings, R.id.battery_settings, R.id.user_settings, R.id.location_settings, R.id.security_settings, R.id.account_settings, R.id.account_add, R.id.accessibility_settings, R.id.print_settings, R.id.development_settings };
在private void updateHeaderList(List
target)函数中,会根据当前平台是否支持某项feature,决定是否显示对应的header,如果不想要那个就可以remove:
private void updateHeaderList(List<Header> target) { final boolean showDev = mDevelopmentPreferences.getBoolean( DevelopmentSettings.PREF_SHOW, android.os.Build.TYPE.equals("eng")); int i = 0; final UserManager um = (UserManager) getSystemService(Context.USER_SERVICE); mHeaderIndexMap.clear(); while (i < target.size()) { Header header = target.get(i); // Ids are integers, so downcasting int id = (int) header.id; if (id == R.id.operator_settings || id == R.id.manufacturer_settings) { Utils.updateHeaderToSpecificActivityFromMetaDataOrRemove(this, target, header); } else if (id == R.id.wifi_settings) { // Remove WiFi Settings if WiFi service is not available. if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI)) { target.remove(i); } } else if (id == R.id.bluetooth_settings) {
下面图片就是我显示的数据。
相关文章推荐
- Android实现表情 抓取新浪表情
- 详解Android解析Xml的三种方式——DOM、SAX以及XMLpull
- android开发环境遇到adt无法启动的问题分析及解决方法
- Android开发 旋转屏幕导致Activity重建解决方法
- Android开发技巧之在a标签或TextView控件中单击链接弹出Activity(自定义动作)
- Android开发技巧之ViewStub控件惰性装载
- Android开发常用经典代码段集锦
- 分享10个很棒的学习Android开发的网站
- android开发之横向滚动/竖向滚动的ListView(固定列头)
- Android开发技巧之我的菜单我做主(自定义菜单)
- Windows下使用Apache Cordova开发ANDROID之HelloWorld
- 根据根据图片的url怎么取得图片ImageView对象
- [转] ADB server didn't ACK
- android开发的相关链接
- Android数据存储之SharedPreferences 共享首选项/偏好设置
- 基于NDK的Android防破解
- 麦子学院android开发笔记:Android更换RatingBar图片
- android开发入门知识之AIDL详解
- AutoCompleteTextView组件的功能和用法