一、首先介绍一下Android的屏幕,如上图所示,Android屏幕大致分为三个部分:通知栏、内容区、导航栏。

1、通知栏位于屏幕顶部,也用于显示电量、时间等状态,所以也是statusbar(状态栏)。

2、内容区上方可以分割出一个栏,最开始叫titlebar,只是放置APP的标题用。Android4.1开始,里面会加入显示更多的东西,进化为actionbar(操作栏),里面会放置例如文件系统的 save、delete按钮。在之后的发展中逐渐使用toolbar,它可以作为导航键代替actionbar(如图中的返回按钮),toolbar可以方便的放置在页面的任意位置。

二、源码中

在settings源码中有这样一段:isToolbarEnabled

Android源码Settings中的 Toolbar_静态加载

追踪代码:

Android源码Settings中的 Toolbar_资源文件_02

看到这里的时候有了疑问,为什么其他的activity都是默认的true,只有恢复出厂设置的activity是false,这个到底起到什么样的作用?

从这段代码来看,判断条件是当 isToolbarEnabled==true 并且当前不是安装向导时,使用的是 R.layout.collapsing_toolbar_base_layout 这个资源文件,否则使用的是 R.layout.settings_base_layout 资源文件。

当 isToolbarEnabled==false 或者当前是安装向导时,要将操作栏隐藏。隐藏时的效果图如下:

Android源码Settings中的 Toolbar_资源文件_03

当为true,或者不隐藏时是这样的:

Android源码Settings中的 Toolbar_布局文件_04

🆗,现在isToolbarEnabled的作用已经明确了,又有了新的疑问,为什么会有两个布局文件,这两个有什么区别?

继续追踪代码发现,R.layout.collapsing_toolbar_base_layout 这个资源文件位于frameworks/base/packages/SettingsLib/CollapsingToolbarBaseActivity的res下,R.layout.settings_base_layout 资源文件就是位于Settings的res下,两个资源文件内部是一样的,但是在framworks下除了资源文件外,还有具体的控制这个工具栏的activity。

Android源码Settings中的 Toolbar_资源文件_05

CollapsingToolbarBaseActivity是一个Activity类,

CollapsingToolbarBaseFragment是一个Fragment类。

看代码:

Android源码Settings中的 Toolbar_布局文件_06

CollapsingToolbarBaseFragment类用于静态加载fragment。(静态加载一旦添加就不能在运行时删除)

而CollapsingToolbarBaseActivity类用于启动activity时加载对应的布局文件。

两个类中都有一个disableCollapsingToolbarLayoutScrollingBehavior方法,用于在使用这个布局时禁止拖动该布局页面。代码如下:

Android源码Settings中的 Toolbar_静态加载_07