gpt4 book ai didi

android - 解决android :gravity and android:layout_gravity之间的冲突

转载 作者:太空宇宙 更新时间:2023-11-03 10:45:33 25 4
gpt4 key购买 nike

考虑以下简单的布局。

<?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

layoutHorizo​​ntal() 等价。

此外,这只是一个注释,但 android:layout_gravity 可以 从 Java 代码访问。这是 gravity fieldLinearLayout.LayoutParams 类中(设置为 subview 的 LayoutParams)。

关于android - 解决android :gravity and android:layout_gravity之间的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24826675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com