考虑以下简单的布局。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="bottom"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_gravity="top" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
</LinearLayout>
outer LinearLayout
指定它有
android:gravity="bottom"
这意味着它希望它的 child “跌到谷底”。
inner LinearLayout
指定
android:layout_gravity="top"
这意味着它希望将自身 放置在其封闭布局的顶部。 (要指定 android:layout_gravity
,显然必须直接编辑 XML 文件。似乎没有办法从 Eclipse 获取该属性。无论如何...)
Android 是如何解决这样的冲突的?上面的示例表明 gravity
属性覆盖了 layout_gravity
属性。冲突通常是这样解决的吗?
最佳答案
查看 LinearLayout
中的 layoutVertical()
方法, LinearLayout
本身的gravity
决定了子元素的位置。
每个 child 的 layout_gravity
仅用于“在另一个方向”(即左右)布局。
首先:
final int majorGravity = mGravity & Gravity.VERTICAL_GRAVITY_MASK;
final int minorGravity = mGravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK;
switch (majorGravity) {
case Gravity.BOTTOM:
childTop = ...
break;
// ... same for CENTER_VERTICAL and TOP
}
然后,对于每个 child :
for (int i = 0; i < count; i++) {
final View child = getVirtualChildAt(i);
final LinearLayout.LayoutParams lp =
(LinearLayout.LayoutParams) child.getLayoutParams();
int gravity = lp.gravity;
if (gravity < 0) {
gravity = minorGravity;
}
final int layoutDirection = getLayoutDirection();
final int absoluteGravity = Gravity.getAbsoluteGravity(gravity, layoutDirection);
switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
case Gravity.CENTER_HORIZONTAL:
childLeft = ...
break;
// ... same for RIGHT and LEFT
和 layoutHorizontal()
等价。
此外,这只是一个注释,但 android:layout_gravity
可以 从 Java 代码访问。这是 gravity
field在 LinearLayout.LayoutParams
类中(设置为 subview 的 LayoutParams
)。
关于android - 解决android :gravity and android:layout_gravity之间的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24826675/