首先解答这个问题:
<LinearLayout
......>
<android.support.design.widget.TabLayout
android:id="@+id/tablayout"
android:layout_width="match_parent"
android:layout_height="45dp"
android:background="@color/blue"
app:tabIndicatorColor="@color/white"
app:tabSelectedTextColor="@color/gray"
app:tabTextColor="@color/white">
</LinearLayout>
TabLayout的XML属性中并没有 layout_width, layout_height, 凭什么要加这两个属性?还必须要加,否则 AS 提示错误:
加的时候 AS 提示它是 required 的:
官方文档里是这么描述的:
- ViewGroup类包含一个嵌入类 LayoutParams
- ViewGroup的子类(太多了:LinearLayout、RelativeLayout、RecyclerView……)也包含一个嵌入类 LayoutParams,并且继承自 ViewGroup.LayoutParams
- LayoutParams并不是ViewGroup自己用的,而是给ViewGroup容器中所容纳的元素使用,比如上图中:
- RelativeLayout和同级的两个View要定义LinearLayout.LayoutParams
- 最下面的3个View要定义RelativeLayout.LayoutParams
- ViewGroup 类中会使用容器中得元素的 LayoutParams 来对其布局。
比如在 ViewGroup.java 中会看到这样的代码
问题已经很明朗了,ViewGroup及其容器性质的继承类都定义一个LayoutParams嵌入类来给元素使用,这些都是布局性质的,所有都是用 layout_ 前缀打头,比如:
ViewGroup.LayoutParams:
ViewGroup. MarginLayoutParams
而 ViewGroup 自己的 XML 属性是:
再比如:
LinearLayout.LayoutParams
而 LinearLayout 自己的 XML 属性是:
从中可以看出:一个LinearLayout中的view元素, layout_gravity 是定义给 LinearLayout 用的, gravity 是定义给自己用的。
顺便也贴一下最近常用的 RecyclerView吧:
RecyclerView.LayoutParams:
没定义啥新的。
RecyclerView 自己的 XML 属性:
也只是定义了一个新的,其他都是继承了 view.View 和 view.ViewGroup。
view.ViewGroup上面有贴图了,view.View 的 XML 属性就多了,这里查看.