我试图理解标题中的代码行。我知道?表示该值将从主题中获取。但是当它带有前缀attrs时,我知道它是在android系统中定义的。我也看到应用程序中选定的主题是Theme.AppCompat.NoActionBar的子元素,该子元素不确定actionBarSize:
的值<style name="Theme.AppCompat.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<declare-stylable name="Theme">
<attr name="actionBarSize" format="dimension" >
<enum name="wrap_content" value="0" />
</attr>
[我还在某些GitHub资源上找到了一个主题(名称为Theme),它确实为actionBarSize赋了一个值,但该主题似乎不是新android api的任何父链中的父项:Theme.xml
您已经发现,.NoActionBar
提供的仅有两个属性是:
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
其余属性均从该样式的父级继承。在.NoActionBar
的父样式链中,Base.V21.Theme.AppCompat.Light
设置为actionBarSize
:
<item name="actionBarSize">?android:attr/actionBarSize</item>
在这种情况下,?android:
前缀表示它直接来自Android平台,并将其设置为56dp
。
如果您查看样式的快速文档,就可以看到所有这些内容:
除此之外,android:layout_height="?attr/actionBarSize"
均值是视图应与动作栏的高度相同。最终值变成56dp
并不重要;关键是,无论实际值是多少,此视图将很高。