关于Toolbar中navigationIcon和title之间距离及展开

问题缘起

在进行Coolcode项目的MyclassActivity中,我发现navigationIcon和title之间的实际间距与UI图不符,虽然康师傅说不需要改,但是出于好奇心我还是希望明白其中原因。
UI要求

实际显示

问题分析

由于学习Android时间不长,无法一步直指问题所在,所以我们就从和Toolbar有关的所有代码里面一个个找(在myclasses里面)。
首先我们在MyClassActivity中首次调用了BaseActivity中的initBackToolbar(Toolbar toolbar, @StringRes int title, @DrawableRes int navigationIcon)方法,显然这个方法并没有对距离有任何修改。
那么我们在来看这个BaseActivity中的方法,它给Toolbar设置了title和navigationIcon,但是并不能看到其中有对之间的距离有做相应修改,我们翻看其他myclasses下的类,也并没有发现。

那么,问题看来只能是出现在Toolbar中了,那么来看一下Toolbar代码。
……!
好长!相信没有完整的时间和计划大家是不会想好好看完这段代码的。那么我们直接来看里面最重要的控制输出的代码onLayout(boolean changed, int l, int r, int b)

整理逻辑:

onLayout函数先判定并输出NavigationIcon,CollapseButton和Menu三个控件。
比较系统缩进值和真实缩进值,取大者为实际缩进值。
onLayout函数判定并输出ExpandedAction和Logo两个控件。
onLayout函数判定并输出Title和SubTitle两个控件。

根据实际需求,实际mToolbar需要输出的只有NavigationIcon和Title控件。那么两者之间的距离就应该是实际缩进值。
简单的来说,就是left = Math.max(left, contentInsetLeft);的这个left。
那么实际缩进值是如何计算的呢,我们重新进入代码:

那么ContentInsetStart和ContentInsetStartWithNavigation的值是多少呢,我们打开appcompat-v7包的以下位置.

Toolbar的默认style是appcompat-v7中的Widget.AppCompat.Toolbar

Widget.AppCompat.Toolbar的父类是Base.Widget.AppCompat.Toolbar

contentInsetStart的值是16dp,contentInsetStartWithNavigation简单查找出来是72dp。
所以,当我们的NavigationIcon控件宽度较小的时候,title与父视图的左边框缩进为72dp,而不是紧随NavigationIcon(一般为56db)。

解决方法

搞明白了问题的原因,自然也找到了问题的解决方法。
我们打开程序/src/main/res/values/styles.xml,自创一个新的style(父类设定为Base.Widget.AppCompat.Toolbar),在style中重写资源代码:

简单的设定为0dp的话就保证Title的left参数紧贴NavigationIcon。
当然,我们也可以进行其他的设定来控制title的位置啦!

Comments

发表评论

电子邮件地址不会被公开。 必填项已用*标注