【问题标题】:Using layout_gravity="bottom" to place at bottom of LinearLayout使用 layout_gravity="bottom" 放置在 LinearLayout 的底部
【发布时间】:2017-11-01 03:21:17
【问题描述】:

我想在 LinearLayout 的底部放置一个布局,但我似乎无法让它工作。我知道我可以使用 RelativeLayout 来做到这一点,但我应该可以使用 LinearLayout,不是吗?

编辑:实际上这比我想象的更令人困惑。下面的布局被简化了。实际上,我在 3.0 之前的设备上使用 Fragments,并带有兼容层。

我使用 Hierarchy Viewer 检查发生了什么,发现我的布局中添加了一个 android.support.v4.app.NoSaveStateFrameLayout,并且该布局的 layout_height 设置为 wrap_content。这似乎是导致我的问题的原因,但我还没有想出如何解决它。

具体来说,为什么这不起作用? layout_gravity不应该放在底部吗?

<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

        ... stuff here ...

        <LinearLayout 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:orientation="horizontal">

            ... more stuff here ...

     </LinearLayout>
</LinearLayout>

顺便说一句,将 layout_height 更改为 fill_parent 或设置 layout_weight 似乎也不起作用。我只是想更好地了解发生了什么,因为显然我错过了一些重要的事情。谢谢。

【问题讨论】:

  • 它有什么作用?你能发布布局的快照吗?
  • 它只是将第二个布局放在前一个布局的下方。

标签: android android-layout


【解决方案1】:

首先是个好问题。

Android 在这种情况下的行为我们可以说很奇怪。

如果您选择了父线性布局的水平方向,则可以通过设置其layout_gravity=bottom 将其子组件设置在底部。假设您在该水平线性布局中添加了 2 个文本视图,并且第二个文本视图的 layout_gravity 是底部,那么它将设置为底部,但它的工作方式就像它设置在其他列的底部,然后是第一个文本视图。 注意:你可以设置 textview 的 layout_gravity = "left" or "right" 当它的父线性布局是水平的但你看不到它的结果。

相反,如果您选择了父线性布局的方向垂直,那么您可以使用 layout_gravity 将其子组件设置在左侧或右侧。但是第二个文本视图将显示在您可以按照您设置的左或右重力说下一行。 注意你可以设置 textview 的 layout_gravity = "top" 或者 "bottom" 当它的线性布局是垂直的但是你看不到它的结果。

尝试按照我上面所说的方式制作示例 xml 设计,以便您获得更好的想法。

奇怪但真实!!!尝试理解这种行为。 :)

【讨论】:

  • 是的,你是对的,orientation=vertical/layout_gravity=bottom 元组似乎不起作用,因此相反的水平/左侧也不起作用是有道理的。跨度>
【解决方案2】:

只需在底部和其他所有内容之间添加空格即可:

        <Space
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>

【讨论】:

    【解决方案3】:

    所以我解决了这个问题。这是一个两部分的解决方案:

    首先,不使用 LinearLayout 的方法是为上面的元素提供权重,以便它占据所有空白空间。顺便说一句,你可以在 API 演示中看到这个例子:http://developer.android.com/resources/samples/ApiDemos/res/layout/linear_layout_3.html

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    
            ... stuff here ...
            <TextView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:weight="1"/>
            <LinearLayout 
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">
    
                ... more stuff here ...
    
         </LinearLayout>
    </LinearLayout>
    

    这本身并没有解决我的问题,因为我有一个 NoSaveStateFrameLayout,其父视图为 layout_width="wrap_content",所以我需要先解决这个问题。我正在使用基于美妙Google I/O App的代码,当我搜索NoSaveStateFrameLayout的代码时,我发现了这个:

    // For some reason, if we omit this, NoSaveStateFrameLayout thinks we are
    // FILL_PARENT / WRAP_CONTENT, making the progress bar stick to the top of the activity.
    mRootView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
            ViewGroup.LayoutParams.FILL_PARENT));
    

    感谢 Google 的精彩评论!!!我将它添加到我的源代码中,一切都很好!

    故事的寓意:Hierarchy Viewer 和 cmets 是你的朋友。

    【讨论】:

    • 谢谢,重量对我有帮助
    • 我认为应该是“layout_weight”而不仅仅是“weight”——至少这似乎是可行的,并且在 [sdk_dir]/samples/android-8/ApiDemos/res/layout /linear_layout_3.xml 文件
    【解决方案4】:

    LinearLayout 只会将放置在那里的东西堆叠起来。由于它是垂直的,它会以垂直的方式一个接一个地放置项目。你能改变线性布局的 android:gravity 而不是嵌套布局的 layout_gravity 看看是否有效。

    RelativeLayout 当然应该是第一种方式,但你说你不想那样做。有什么理由吗?

    【讨论】:

    • 不想使用RelativeLayout的两个原因:一个是我上面有一堆项目,不想在彼此上添加android:layout_below=""。另一个原因是我只是想更好地理解这一点。
    • 使用重力而不是 layout_gravity 在 layout_height 设置为 wrap_content 时不起作用,正如预期的那样。但是,如果我将 layout_height 设置为 fill_parent 并将重力设置为 bottom,它也不起作用——我忘了​​提,但它似乎也应该起作用,对吧?
    • 使用相对和两个线性...将一个线性对齐顶部,一个对齐底部,然后将所有东西放在里面。
    • 谢谢,但我找到了一个无需嵌套额外布局的解决方案;您只需找到哪个 View 应该占用剩余的空白空间并为其分配一些 layout_weight - 比嵌套恕我直言更好。
    • 您现在必须确保它适用于所有屏幕尺寸......这没有比您的问题更深的嵌套。它是嵌套在一个相对内部的两个线性。
    【解决方案5】:

    可能是,根据https://stackoverflow.com/a/13366783/513038,您需要将父LinearLayout 设置为具有android:baselineAligned="false"。在我的情况下工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 2020-11-09
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      • 2015-12-16
      相关资源
      最近更新 更多