Android 4.4 Settings 应用分析
来源:互联网 发布:淘宝买到假货如何索赔 编辑:程序博客网 时间:2024/05/29 19:12
一次偶然要在设置里面增加一个菜单,需要修改到settings_headers.xml 文件(res/layout/xml) 文件,所以就觉得要看一下这个流程.
分析Android 源码的时候导入单个应用的时候一般是会有很多错误的,因为需要导入系统编译之后生成的jar包才能消除eclipse 里面的哪些红色xx.
1.Settings的UI
图一
图2
2.流程分析
从AndroidManifest.xml 中查看
<category android:name="android.intent.category.LAUNCHER" /> 知道Settings.java 是这个应用入口activity.
Settings 继承了PreferenceActivity .他的布局文件是settings_headers.xml
这个文件里面都是这些header,效果可以参考上面的效果图1和图2.
<!-- WIRELESS and NETWORKS 分类-->
<header android:id="@+id/wireless_section"
android:title="@string/header_category_wireless_networks" />
<!-- Sim management 普通项-->
<header
android:id="@+id/sim_settings"
android:icon="@drawable/ic_settings_dualsim"
android:fragment="com.mediatek.gemini.SimManagement"
android:title="@string/gemini_sim_management_title" />
com.android.settings.Settings.java 这个activity 是通过回调onBuildHeaders方法来加载进入应用之后的第一个布局文件的,然后调用 loadHeadersFromResource(R.xml.settings_headers, headers);
来解析 文件.
onBuildHeaders 和loadHeadersFromResource 方法都是父类PreferenceActivity 的方法.
Settings.java 重写onBuildHeaders 方法的实现的源码如下:
/**
* Populate the activity with the top-level headers.
*/
@Override
public void onBuildHeaders(List<Header> headers) {
if (!onIsHidingHeaders()) {
PDebug.Start("loadHeadersFromResource");
loadHeadersFromResource(R.xml.settings_headers, headers);
PDebug.End("loadHeadersFromResource");
updateHeaderList(headers);
}
}
loadHeadersFromResource 方法就是解析settings_headers.xml 文件并保持相关的数据到List<Header> headers 里面.
Header 定义很多变量来和settings_headers.xml 里面节点一一对应,
public long id = HEADER_ID_UNDEFINED;
public int titleRes;
public CharSequence title;
public String fragment;
public Bundle fragmentArguments;
public Intent intent;
public Bundle extras;
………
通过跟踪Setting.java 的父类(PreferenceActivity)的继承关系知道他其实也是一个ListActivity.java ,全部的设置项也是使用ListView来显示的.
HeaderAdapter这个适配类是Setting.java 的内部类,它会判断之后来加载对应的view和数据来显示UI.
HeaderAdapter已经定义了4中类型的View 类型
static final int HEADER_TYPE_CATEGORY = 0;//用来分类的
static final int HEADER_TYPE_NORMAL = 1;//常规项
static final int HEADER_TYPE_SWITCH = 2;//开关项
static final int HEADER_TYPE_BUTTON = 3;//按钮项
前3种应该都见过,为了让大家看到第4项,我把稍微修改了一下我的HeaderAdapter源码,也就是上面图2中的security 选项.
HeaderAdapter 的getHeaderType 方法决定了配置在settings_headers.xml 里面的header的类型.
HeaderAdapter 的getView 方法根据header的类型 来加载对应的布局文件.
static int getHeaderType(Header header) {
if (header.fragment == null && header.intent == null) {
return HEADER_TYPE_CATEGORY;
} else if (header.id == R.id.wifi_settings || header.id == R.id.bluetooth_settings
|| header.id == R.id.hotknot_settings) {
return HEADER_TYPE_SWITCH;
} else if (header.id == R.id.security_settings) {
return HEADER_TYPE_BUTTON;
} else {
return HEADER_TYPE_NORMAL;
}
}
getView 方法内容太多,这里就不贴出来了.
但要注意的是在getView方法里面,当发现一个header 的类型是button的时候也会给header 的button增加一个onclick事件的,这个事件和header本事的onHeaderClick 是没有冲突的,因为2者不受同一个控件.
那么每一个header 是如果响应点击操作的呢.这个就要看Setting.java的onHeaderClick 方法了, onHeaderClick 方法会调用父类的onHeaderClick方法来打开相关的应用,其父类是根据我们配置在settings_headers.xml里面的fragment和intent 来打开相对应的activity的.
Setting.java -- onHeaderClick
public void onHeaderClick(Header header, int position) {
boolean revert = false;
if (header.id == R.id.account_add) {
revert = true;
}
super.onHeaderClick(header, position);
if (revert && mLastHeader != null) {
highlightHeader((int) mLastHeader.id);
} else {
mLastHeader = header;
}
}
PreferenceActivity -- onHeaderClick
public void onHeaderClick(Header header, int position) {
if (header.fragment != null) {
if (mSinglePane) {
Log.d(TAG, "onHeaderClick, single pane and startWithFragment.");
int titleRes = header.breadCrumbTitleRes;
int shortTitleRes = header.breadCrumbShortTitleRes;
if (titleRes == 0) {
titleRes = header.titleRes;
shortTitleRes = 0;
}
startWithFragment(header.fragment, header.fragmentArguments, null, 0,
titleRes, shortTitleRes);
} else {
Log.d(TAG, "onHeaderClick, multiple pane and switchToHeader.");
switchToHeader(header);
}
} else if (header.intent != null) {
Log.d(TAG, "onHeaderClick, start activity with header intent.");
startActivity(header.intent);
}
}
- Android 4.4 Settings 应用分析
- Android 4.4 Settings 应用分析
- Android Settings应用分析
- Android 4.4 Settings 应用初步分析
- android 4.4 Settings分析
- 安装android settings 应用
- Android Settings模块分析
- Android Settings模块分析
- Android Settings模块分析
- android Settings 分析
- Android 应用程序分析之Settings
- Android 应用程序分析之Settings
- Android 应用程序分析之Settings
- Android 应用程序分析之Settings
- android settings源代码分析(3)
- Android L Settings 简要分析
- 20150623----Android-Settings源码分析
- Android L Settings 简要分析
- [SCOI]2005扫雷
- 浏览器 安装 划词翻译 插件的方法
- 解决maven依赖得问题
- mybatis使用log4j
- Java NIO教程 Buffer
- Android 4.4 Settings 应用分析
- fedora25安装utorrent
- android 使用MediaPlayer实现视频播放
- 六大原则
- 分页效果实现
- AdaBoost元算法学习笔记
- java过滤请求参数中的非法字符,防止XSS攻击、SQL盲注等
- Oracle中Merge into用法总结
- 进入保护模式-汇编学习之路