android settings源代码分析(1)

1.Android settings源码的source code路径为:

kikat_4.4_CTS\packages\apps\Settings

 

2.settings主界面UI布局

Settings的启动类为:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * Top-level settings activity to handle single pane and double pane UI layout. 
  3.  */  
  4. public class Settings extends PreferenceActivity  
  5.         implements ButtonBarHandler, OnAccountsUpdateListener  


从继承关系可以看出,Settings类继承于PreferenceActivity,因此具有Preference的一些属性和结构。

 

从Google  settings的UI看出,左边是一些tab,右边是tab对应的内容,那么这些tab以及tab对应的内容主要是什么,以及如何显示的呢?

 

对于tab的显示,对应的code为:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.     * Populate the activity with the top-level headers. 
  3.     */  
  4.    @Override  
  5.    public void onBuildHeaders(List<Header> headers) {  
  6.        if (!onIsHidingHeaders()) {  
  7.            loadHeadersFromResource(R.xml.settings_headers, headers);  
  8.            updateHeaderList(headers);  
  9.        }  
  10.    }  

可以看出,左边的tab实际是一些Header,从settings_headers.xml中获取这些header。settings_header.xml对应的code为:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!-- Copyright (C) 2010 The Android Open Source Project  
  3.   
  4.      Licensed under the Apache License, Version 2.0 (the "License");  
  5.      you may not use this file except in compliance with the License.  
  6.      You may obtain a copy of the License at  
  7.   
  8.           http://www.apache.org/licenses/LICENSE-2.0  
  9.   
  10.      Unless required by applicable law or agreed to in writing, software  
  11.      distributed under the License is distributed on an "AS IS" BASIS,  
  12.      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
  13.      See the License for the specific language governing permissions and  
  14.      limitations under the License.  
  15. -->  
  16.   
  17. <preference-headers  
  18.         xmlns:android="http://schemas.android.com/apk/res/android">  
  19.   
  20.   
  21.     <!-- WIRELESS and NETWORKS -->  
  22.     <header android:id="@+id/wireless_section"  
  23.         android:title="@string/header_category_wireless_networks" />  
  24.   
  25.     <!-- Wifi -->  
  26.     <!-- MStar Android Patch Begin -->  
  27.     <header  
  28.         android:id="@+id/wifi_settings"  
  29.         android:fragment="com.android.settings.wifi.TvWifiSettings"  
  30.         android:title="@string/wifi_settings_title"  
  31.         android:icon="@drawable/ic_settings_wireless" />  
  32.     <!-- MStar Android Patch End -->  
  33.   
  34.     <!-- Ethernet -->  
  35.     <header  
  36.         android:id="@+id/ethernet_settings"  
  37.         android:fragment="com.android.settings.ethernet.EthernetSettings"  
  38.         android:title="@string/ethernet_status_title"  
  39.         android:icon="@drawable/ic_settings_ethernet" />  
  40.   
  41.     <!-- Bluetooth -->  
  42.     <header  
  43.         android:id="@+id/bluetooth_settings"  
  44.         android:fragment="com.android.settings.bluetooth.TvBluetoothSettings"  
  45.         android:title="@string/bluetooth_settings_title"  
  46.         android:icon="@drawable/ic_settings_bluetooth2" />  
  47.   
  48.     <!-- Data Usage -->  
  49.     <header  
  50.         android:id="@+id/data_usage_settings"  
  51.         android:fragment="com.android.settings.DataUsageSummary"  
  52.         android:title="@string/data_usage_summary_title"  
  53.         android:icon="@drawable/ic_settings_data_usage" />  
  54.   
  55.     <!-- Operator hook -->  
  56.     <header  
  57.         android:fragment="com.android.settings.WirelessSettings"  
  58.         android:id="@+id/operator_settings">  
  59.         <intent android:action="com.android.settings.OPERATOR_APPLICATION_SETTING" />  
  60.     </header>  
  61.   
  62.     <!-- Other wireless and network controls -->  
  63.     <header  
  64.         android:id="@+id/wireless_settings"  
  65.         android:title="@string/radio_controls_title"  
  66.         android:breadCrumbTitle="@string/wireless_networks_settings_title"  
  67.         android:fragment="com.android.settings.WirelessSettings"  
  68.         android:icon="@drawable/empty_icon" />  
  69.   
  70.     <!-- DEVICE -->  
  71.     <header android:id="@+id/device_section"  
  72.         android:title="@string/header_category_device" />  
  73.   
  74.     <!-- Home -->  
  75.     <header  
  76.         android:id="@+id/home_settings"  
  77.         android:icon="@drawable/ic_settings_home"  
  78.         android:fragment="com.android.settings.HomeSettings"  
  79.         android:title="@string/home_settings" />  
  80.   
  81.     <!-- Sound -->  
  82.     <header  
  83.         android:id="@+id/sound_settings"  
  84.         android:icon="@drawable/ic_settings_sound"  
  85.         android:fragment="com.android.settings.SoundSettings"  
  86.         android:title="@string/sound_settings" />  
  87.   
  88.     <!-- Display -->  
  89.     <header  
  90.         android:id="@+id/display_settings"  
  91.         android:icon="@drawable/ic_settings_display"  
  92.         android:fragment="com.android.settings.DisplaySettings"  
  93.         android:title="@string/display_settings" />  
  94.   
  95.     <!-- Storage -->  
  96.     <header  
  97.         android:id="@+id/storage_settings"  
  98.         android:fragment="com.android.settings.deviceinfo.Memory"  
  99.         android:icon="@drawable/ic_settings_storage"  
  100.         android:title="@string/storage_settings" />  
  101.   
  102.     <!-- Battery -->  
  103.     <header  
  104.         android:id="@+id/battery_settings"  
  105.         android:fragment="com.android.settings.fuelgauge.PowerUsageSummary"  
  106.         android:icon="@drawable/ic_settings_battery"  
  107.         android:title="@string/power_usage_summary_title" />  
  108.   
  109.     <!-- Application Settings -->  
  110.     <header  
  111.         android:fragment="com.android.settings.applications.ManageApplications"  
  112.         android:icon="@drawable/ic_settings_applications"  
  113.         android:title="@string/applications_settings"  
  114.         android:id="@+id/application_settings" />  
  115.   
  116.     <!-- Manage users -->  
  117.     <header  
  118.         android:fragment="com.android.settings.users.UserSettings"  
  119.         android:icon="@drawable/ic_settings_multiuser"  
  120.         android:title="@string/user_settings_title"  
  121.         android:id="@+id/user_settings" />  
  122.   
  123.     <!-- Manage NFC payment apps -->  
  124.     <header  
  125.         android:fragment="com.android.settings.nfc.PaymentSettings"  
  126.         android:icon="@drawable/ic_settings_nfc_payment"  
  127.         android:title="@string/nfc_payment_settings_title"  
  128.         android:id="@+id/nfc_payment_settings" />  
  129.   
  130.     <!-- Manufacturer hook -->  
  131.     <header  
  132.         android:fragment="com.android.settings.WirelessSettings"  
  133.         android:id="@+id/manufacturer_settings">  
  134.         <intent android:action="com.android.settings.MANUFACTURER_APPLICATION_SETTING" />  
  135.     </header>  
  136.   
  137.     <!-- PERSONAL -->  
  138.     <header android:id="@+id/personal_section"  
  139.         android:title="@string/header_category_personal" />  
  140.   
  141.     <!-- Location -->  
  142.     <header  
  143.         android:fragment="com.android.settings.location.LocationSettings"  
  144.         android:icon="@drawable/ic_settings_location"  
  145.         android:title="@string/location_settings_title"  
  146.         android:id="@+id/location_settings" />  
  147.   
  148.     <!-- Security -->  
  149.     <header  
  150.         android:fragment="com.android.settings.SecuritySettings"  
  151.         android:icon="@drawable/ic_settings_security"  
  152.         android:title="@string/security_settings_title"  
  153.         android:id="@+id/security_settings" />  
  154.   
  155.     <!-- Language -->  
  156.     <header  
  157.         android:id="@+id/language_settings"  
  158.         android:fragment="com.android.settings.inputmethod.InputMethodAndLanguageSettings"  
  159.         android:icon="@drawable/ic_settings_language"  
  160.         android:title="@string/language_settings" />  
  161.   
  162.     <!-- Backup and reset -->  
  163.     <header  
  164.         android:fragment="com.android.settings.PrivacySettings"  
  165.         android:icon="@drawable/ic_settings_backup"  
  166.         android:title="@string/privacy_settings"  
  167.         android:id="@+id/privacy_settings" />  
  168.   
  169.     <!-- @Patch: GTV specific changes -->  
  170.     <!-- MStar Android Patch Begin -->  
  171.     <!-- Update -->  
  172.     <header  
  173.         android:id="@+id/update_settings"  
  174.         android:fragment="com.android.settings.update.UpdateSettings"  
  175.         android:title="@string/update_settings" />  
  176.     <!-- MStar Android Patch End -->  
  177.   
  178.     <!--  ACCOUNTS section -->  
  179.     <header  
  180.             android:id="@+id/account_settings"  
  181.             android:title="@string/account_settings" />  
  182.   
  183.     <header  
  184.             android:id="@+id/account_add"  
  185.             android:title="@string/add_account_label"  
  186.             android:icon="@drawable/ic_menu_add_dark">  
  187.         <intent  
  188.             android:action="android.settings.ADD_ACCOUNT_SETTINGS"/>  
  189.     </header>  
  190.   
  191.     <!-- SYSTEM -->  
  192.     <header android:id="@+id/system_section"  
  193.         android:title="@string/header_category_system" />  
  194.   
  195.     <!-- Date & Time -->  
  196.     <header  
  197.         android:id="@+id/date_time_settings"  
  198.         android:fragment="com.android.settings.DateTimeSettings"  
  199.         android:icon="@drawable/ic_settings_date_time"  
  200.         android:title="@string/date_and_time_settings_title" />  
  201.   
  202.     <!-- Accessibility feedback -->  
  203.     <header  
  204.         android:id="@+id/accessibility_settings"  
  205.         android:fragment="com.android.settings.accessibility.AccessibilitySettings"  
  206.         android:icon="@drawable/ic_settings_accessibility"  
  207.         android:title="@string/accessibility_settings" />  
  208.   
  209.     <!-- Print -->  
  210.     <header  
  211.         android:id="@+id/print_settings"  
  212.         android:fragment="com.android.settings.print.PrintSettingsFragment"  
  213.         android:icon="@*android:drawable/ic_print"  
  214.         android:title="@string/print_settings" />  
  215.   
  216.     <!-- Development -->  
  217.     <header  
  218.         android:id="@+id/development_settings"  
  219.         android:fragment="com.android.settings.DevelopmentSettings"  
  220.         android:icon="@drawable/ic_settings_development"  
  221.         android:title="@string/development_settings_title" />  
  222.   
  223.     <!-- About Device -->  
  224.     <header  
  225.         android:id="@+id/about_settings"  
  226.         android:fragment="com.android.settings.DeviceInfoSettings"  
  227.         android:icon="@drawable/ic_settings_about"  
  228.         android:title="@string/about_settings" />  
  229.   
  230. </preference-headers>  

从上述xml可以看出,header的内容是通过fragment来显示,定义了每一个header对应的fragment。

 

在private void updateHeaderList(List<Header> target)函数中,会根据当前平台是否支持某项feature,决定是否显示对应的header:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. else if (id == R.id.wifi_settings) {  
  2.                // Remove WiFi Settings if WiFi service is not available.  
  3.                if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI)) {  
  4.                    target.remove(i);  
  5.                }  
  6.            } else if (id == R.id.bluetooth_settings) {  
  7.                // Remove Bluetooth Settings if Bluetooth service is not available.  
  8.                if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) {  
  9.                    target.remove(i);  
  10.                }  
  11.            }   

 原文地址:http://blog.csdn.net/zhudaozhuan/article/details/40618837

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值