5

在我的水平线性布局中,我将一个视图中的重力设置为 center_vertical,然后我尝试为第二个视图设置 layout_gravity,但该视图与第一个视图中的居中文本对齐!

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >
    <TextView
        android:layout_width="100dp"
        android:layout_height="200dp"
        android:layout_gravity="top"
        android:background="@drawable/border"
        android:gravity="center_vertical"
        android:text="layout_gravity=top   gravity=center_vertical" >
    </TextView>            
    <TextView
        android:layout_width="100dp"
        android:layout_height="200dp"
        android:layout_gravity="top"
        android:background="@drawable/border"
        android:gravity="top"
        android:text="layout_gravity=top  gravity=top" >
    </TextView>
</LinearLayout>

在此处输入图像描述

这是相同的代码,但用于垂直布局。 请注意,所需的行为在垂直布局中可以正常工作。

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView
        android:layout_width="200dp"
        android:layout_height="100dp"
        android:layout_gravity="left"
        android:background="@drawable/border"
        android:gravity="center_horizontal"
        android:text="layout_gravity=left   gravity=center_horizontal" >
    </TextView>            
    <TextView
        android:layout_width="200dp"
        android:layout_height="100dp"
        android:layout_gravity="right"
        android:background="@drawable/border"
        android:gravity="right"
        android:text="layout_gravity=right  gravity=right" >
    </TextView>
</LinearLayout>

在此处输入图像描述

我可以使用 RelativeLayout 或另一个嵌套的 LinearLayout 来解决问题。但我问这个问题是因为我想知道我是否不了解重力和 layout_gravity 的工作原理!对我来说,了解这些基本属性是如何工作的很重要。谢谢

4

3 回答 3

8

如果您想要一个居中和一个顶部,那么您需要向 LinearLayout 添加一个基线对齐标志

android:baselineAligned="false"

布局默认对齐孩子的基线。当孩子们使用不同的重力值时,这可能会导致诸如此类的问题。

与垂直的不同之处在于基线不能像水平对齐那样对齐。

看:

http://developer.android.com/reference/android/widget/LinearLayout.html#attr_android:baselineAligned

附加信息 - 这似乎比我更好地解释了这个问题:

http://www.doubleencore.com/2013/10/shifty-baseline-alignment/

于 2014-09-29T05:04:18.627 回答
0

如果您正在尝试一些不“相互连接”的东西,即您希望两个小部件之间有一些空间,则使用空白小部件并使用权重

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:weightSum="100" >

<TextView
    android:layout_width="100dp"
    android:layout_height="200dp"

    android:layout_weight="40"
    android:gravity="center_vertical"
    android:text="layout_gravity=top   gravity=center_vertical" >
</TextView>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="20" />

<TextView
    android:layout_width="100dp"
    android:layout_height="200dp"

    android:layout_weight="40"
    android:gravity="right"
    android:text="layout_gravity=top  gravity=top" >
</TextView>

</LinearLayout>

主要答案图片

你不清楚你想要的输出,这就是我可以解释为你需要的输出..但我会解释你这是如何工作的..有关权重的更多信息,你可以去http://developer.android.com/参考/android/widget/package-summary.html

有一种叫做“小部件”和“小部件内容”的东西在谈论带有layout_gravity的线性布局时,您将其自身的重力设置为主视图中的“小部件”,并通过重力将重力设置为该线性布局中的内容

与说 textview 类似,如果您使用layout_gravity(例如等于中心),则 textview 将在其空间中居中(即,如果 layoutorientation 为垂直,它将以其宽度为中心,如果 layout_orientation 为水平,它将以其高度为中心)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<TextView
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_gravity="center"
    android:text="Second Activity" />



</LinearLayout>

水平线性布局

在垂直方向上看到相同的

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_gravity="center"
    android:text="Second Activity" />

</LinearLayout>

垂直线性布局

当您将重力应用于 textview 时,现在还可以查看重力,textview 中的“TEXT”居中(如果重力 = 中心)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_gravity="center"
    **android:gravity="center"**
    android:text="Second Activity" />

</LinearLayout>

centerText垂直

现在您可以意识到重力将重力设置为小部件内的内容。小部件的“内容”可以是小部件本身。LinearLayout 是一个小部件,在线性布局中您可以添加其他类型的小部件(按钮和文本视图)因此将重力=中心应用于文本视图将其内容(即文本)设置在中心并将重力应用于线性布局将其内容(即文本视图)置于中心

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" 
android:gravity="center">

<TextView
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_gravity="center"
    android:gravity="center"
    android:text="Second Activity" />

</LinearLayout>

layout_gravity_center

于 2014-09-29T04:48:01.733 回答
0

gravity是视图本身如何在由其宽度和高度确定的区域内定位其内容。layout_gravity父视图如何将子视图定位在父区域内。通常你可以简单地设置gravityLinearLayout而不是设置layout_gravity它的所有孩子。

请注意,对于LinearLayouts,gravity仅对不是方向的轴有影响,例如top 和bottom 与水平LinearLayout 相关,但left 和right(或start 和end)不相关。

于 2014-09-29T04:21:25.893 回答