Android设置之UI篇

一、  Android设置界面是如何定义的呢?

答:Android 系统设置的主界面是Settings.java,该类的定义为:

同时我们看看Settings.java的onCreate函数:

这里似乎没有调用setContentView的方法,那么设置的界面是如何显示的呢?那我们去它的父类(PreferenceActivity)中找找看,我们来看看这个类的onCreate方法:

正如我们看到,原来设置的界面定义为framework中的preference_list_content.xml。

通过查看preference_list_content.xml文件我们知道该布局的结构就是左右结构,左侧为一个ListView,右侧为一个PreferenceFrameLayout。

但是我们要注意的是右侧的android:visibility为gone,为什么呢?这是因为它是否显示是根据屏幕的尺寸进行适配的,如果屏幕足够大比如智能电视或者pad,就是左右结构;如果是手机,则只显示左侧的ListView,右侧内容需要单独显示。那么我们是如何判断屏幕要不要显示左右结构呢?这在PreferenceActivity.java中有函数进行判断:

也就是说是从资源文件中读取的,那我们看看这个资源文件是如何定义的呢?

也就是说PreferenceActivity去读取framework中的preference_prefer_dual_pane属性,如果返回的是true则表示是大屏设备,否则便是小屏了。

二、那么左侧列表的内容又是如何加载进去的呢?

答:在需要显示列表的时候,PreferenceActivity的onCreate会调用onBuildHeaders方法去加载列表的内容,首先Settings.java 重写了onBuildHeaders方法,方法定义如下:

/**

* 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);

}

}

该方法调用了PreferenceActivity.java中的loadHeadersFromResource方法,该方法就是解析xml文件,并将解析出来的header列表保存到headers中,解析的代码就省略了。那我们现在看看settings_headers.xml文件的定义。

解析并保存到headers中之后,Settings.java 调用了updateHeaderList方法对列表进行更新操作。那更新完了之后便是加载到ListView中去了,其中便用到了一个HeaderAdapter这个内部类了,这个内部类的作用就是把headers的内容加载到listView中,其中header是有4种分类的,一种是带有switch开关的(HEADER_TYPE_SWITCH比如wifi),一种是总分类的(HEADER_TYPE_CATEGORY比如更多),一种是正常的(HEADER_TYPE_NORMAL),还有一种就是按钮型的(HEADER_TYPE_BUTTON)。具体见:

在Settings.java中定义了setListAdapter方法,父类在onCreate方法中调用,从而就显示了列表内容。

三、 那如何做到点击item跳转到对应的fragment的呢?

当点击listView中的item的时候,PreferenceActivity.java 中onListItemClick进行处理,

这个函数调用了onHeaderClick函数,

这个函数针对不同的配置做不同的处理,如果是单屏也就是小屏幕的便是调用startWithFragment方法;如果是大屏幕的便调用switchToHeader函数;如果header中的fragment为null且header.intent不为空,则调用startActivity。

四、对于小屏幕的设备,点击item是如何调转到下一个界面的呢?

根据第三点我们知道,当是小屏设备时,点击item会调用startWithFragment函数,如下:

接下来看一下onBuildStartFragmentIntent的定义:

五、对于大屏幕的设备,点击item是如何调转到下一个界面的呢?

  根据第三点我们知道,当是小屏设备时,点击item会调用switchToHeader(header);函数如下:

  

结束语:

Android系统设置的UI部分大致就学习到这里,总体来说就是界面的布局,ListView的加载,headers的解析和初始化,ListView的item点击事件。

Android设置之UI篇

时间: 2024-08-04 20:14:24

Android设置之UI篇的相关文章

Android开发学习——UI篇1.0

Android开发学习--UI篇1.0 从控件开始 TextView 最基本的文本显示控件 相信同学对刚开始使用Android studio时生成的第一个程序还有印象.兴致满满地将软件已经编好的基础程序运行在手机上,一句Hello world!赫然出现在手机中间,也标志着你开始走进了一个Android的世界! 而这句话,就是用我们的TextView控件来显示出来的. 未完待续! 原文地址:https://www.cnblogs.com/8cloud33zzk/p/9164546.html

22个值得收藏的Android开源代码-UI篇

  FileBrowserView 一个强大的文件选择控件.界面比较漂亮,使用也很简单.特点:可以自定义UI:支持复制.剪切.删除.移动文件:可以用在Fragment.ativity.DialogFragment中:支持快速切换目录. 项目地址: https://github.com/psaravan/FileBrowserView MultiItemRowListAdapter 多列效果的ListView,采用重新包装adapter的方式,使你的ListView可以显示成多列,跟普通的List

Android应用开发-小巫CSDN博客客户端UI篇

Android应用开发-小巫CSDN博客客户端UI篇 上一篇是给童鞋们介绍整个项目的概况,从这篇博文开始,后续也会详细介绍整个客户端的开发,但不会贴很多代码,我会贴核心代码然后提供实现思路,想看里面更详细的代码的可以到我的资源页下载源码进行查看,之前上传到github的少了些jar包,所以我在csdn下载频道也上传了一份,地址:http://download.csdn.net/detail/wwj_748/7912513. 整个客户端的开始,自然是需要搭建一个承载我们数据的框架,我这里所说的是U

Android性能调优篇之UI布局优化

详细内容请查看我的简书地址:Android性能调优篇之UI布局优化 或者我的个人博客地址:Android性能调优篇之UI布局优化

文顶顶 iOS开发UI篇—iOS开发中三种简单的动画设置

iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView beginAnimations:nil context:nil]; //设置动画时长 [UIView setAnimationDuration:2.0]; self.headImageView.bounds = rect; // commitAnimations,将beginAnimation之后的所

iOS开发UI篇—iOS开发中三种简单的动画设置

iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView beginAnimations:nil context:nil]; //设置动画时长 [UIView setAnimationDuration:2.0]; self.headImageView.bounds = rect; // commitAnimations,将beginAnimation之后的所

iOS开发UI篇—ios应用数据存储方式(偏好设置)

iOS开发UI篇—ios应用数据存储方式(偏好设置) 一.简单介绍 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用都有个NSUserDefaults实例,通过它来存取偏好设置.比如,保存用户名.字体大小.是否自动登录 存储位置: 存储形式: 二.代码示例 1.storyboard 2.代码 1 // Created by 鑫 on 14-10-24. 2 // Copyright (c) 2014年 梁镋鑫.

android ui篇

android ui篇主要做两件事情. 第一件事情就是能够自己去定义基本的简单的界面. 第二件事情就是能够使用开源library去构造一些复杂的界面. 第一件事情就需要对于布局等方面知识有着基本的掌握. 例如xml文件中各控件的属性,屏幕的宽度等等. 第二件事情是难点,用于实现一些较为复杂的界面.

Android应用程序UI硬件加速渲染的预加载资源地图集服务(Asset Atlas Service)分析

我们知道,Android系统在启动的时候,会对一些系统资源进行预加载.这样不仅使得应用程序在需要时可以快速地访问这些资源,还使得这些资源能够在不同应用程序之间进行共享.在硬件加速渲染环境中,这些预加载资源还有进一步优化的空间.Android系统提供了一个地图集服务,负责将预加载资源合成为一个纹理上传到GPU去,并且能够在所有的应用程序之间进行共享.本文就详细分析这个预加载资源地图集服务的实现原理. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 资源预加载