android settings源代码分析(1)

来源:互联网 发布:golang.org上不去 编辑:程序博客网 时间:2024/04/30 12:21

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

0 0
原创粉丝点击