最近在研究Android的Settings源码,先看一下源码的目录结构。大概967左右个文件,是不是及其头疼而且无从下手?待我娓娓道来~~~~~

1,初识Settings
首先,这么多文件,到底哪个文件是主界面呢?在Settings目录下找到Androidmanifest.xml清单配置文件,找到首先启动的activity:
- <activity android:name="Settings" android:label="@string/settings_label_launcher" android:taskAffinity="com.android.settings" android:launchMode="singleTask">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <action android:name="android.settings.SETTINGS" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
可以看到,设置的主界面是Settings.Java(package com.android.settings;),
- public class Settings extends PreferenceActivity
- implements ButtonBarHandler, OnAccountsUpdateListener {
- .....
- <pre name="code" class="java"> loadHeadersFromResource(R.xml.settings_headers, headers);
-
- .....
- }
所对应的xml文件为Settings_headers.xml(res\xml\)文件。在此摘列出xml文件的一部分。
- <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" />
-
- <!-- MobileData -->
- <header
- android:id="@+id/mobiledata_settings"
- android:icon="@drawable/stat_notify_mobile_data"
- android:title="@string/data_usage_enable_mobile">
- <intent
- android:action="android.intent.action.MAIN"
- android:targetPackage="com.android.phone"
- android:targetClass="com.android.phone.MobileNetworkSettings" />
- </header>
- .........
- </preference-headers>
每个可以选择和点击的item基本有四个属性,以WiFi_header为例
id:对应的id
fragment:点击之后的fragment:WifiSettings
title:header的主标题,即在Settings主界面显示的文本:WLAN
icon:header的图标,即显示在文本左侧的图标
分析这两个文件可以总结下Settings的布局,Settings主界面显示借助PreferenceActivity,Preference意为偏爱偏好,特点是利用键值对记录用户上次的选择,在下次进入到该界面时直接读取上次的选择无须再进行配置。Activity意为界面,preferenceactivity结合两者。每行属于一个header,相当于listview中的item,每一个header又有fragment与之对应,而fragment的加载依赖于Activity,所依赖的Activity为SubSettings.java(package com.android.settings;//继承与Settings),在Subsetting.java中已经写明:
-
-
-
-
-
- public class SubSettings extends Settings {
-
- @Override
- public boolean onNavigateUp() {
- finish();
- return true;
- }
-
- @Override
- protected boolean isValidFragment(String fragmentName) {
- return true;
- }
- }
对Setting源码的分析可以分两个步骤进行入手,
第一,headers列表的加载
第二,header的点击事件的处理
解决以上两个问题后,就可以开始对不同模块进行分析
2,设置界面布局,加载headers
(1),加载xml布局文件
可以使用两种方式加载xml文件布局
方法一:
- loadHeadersFromResource(R.xml.settings_headers, headers);
方法二:
- addPreferencesFromResource(R.xml.fragmented_preferences_inner);
(2),定义adapter加载并显示headers
- private static class HeaderAdapter extends ArrayAdapter<Header> {
设置界面布局的适配器adapter,有以下几种type
i>,HEADER_TYPE_CATEGORY:无焦点,不可以点击
ii>,HEADER_TYPE_BUTTON:带有button的header,button的visibility(可见性)有条件(可自行设置)
iii>,HEADER_TYPE_NORMAL:正常的可获取焦点可点击的不带button的header
3,Settings.java源码分析(部分提取)
(1),onCreate方法中:
- if<span style="margin: 0px; padding: 0px; border: none; background-color%3