【问题标题】:How can I get all available width?如何获得所有可用宽度?
【发布时间】:2015-08-08 04:59:04
【问题描述】:

我有一个水平方向的线性布局。
布局左侧是垂直方向的线性布局。
布局右侧是固定宽度 80dp * 80dp 的小视图。
问题:
如果我将左侧布局设置为宽度“match_parent”,则右侧布局不可见。
如果我使用“width=0dp”和“weight=1”设置正确的布局以获得尽可能多的可用空间,它只会环绕内容。我的意思是它不会一直到右边的下一个元素。

如何确保左侧元素全部扩展到父宽度减去右侧元素占用的 80 dp?

【问题讨论】:

    标签: java android android-layout android-linearlayout


    【解决方案1】:

    试一试(背景颜色仅用于可视化正在发生的事情):

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
    
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:orientation="vertical"
            android:background="#00ff00">
    
        </LinearLayout>
    
        <View
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:background="#ff0000"/>
    
    </LinearLayout>
    

    【讨论】:

      【解决方案2】:

      对此的一般方法是将右侧元素的宽度硬编码为 80dp,并在左侧设置以下内容:

      android:layout_width="0dp"
      android:layout_weight="1"
      

      这允许右侧元素测量自身并保留其 80dp,然后父元素将所有额外空间授予左侧元素,因为它的权重为 1。

      编辑:

      为了进一步解释为什么 match_parent 将你的右手元素推到屏幕外——当 LinearLayout 有一个具有 layout_weight 的子元素时,它将执行两次布局传递。第一遍将根据指定的宽度/高度分配最小的空间量。正是在此过程中,您的 match_parent 元素将表现如您所见并填充它的父容器,从而将正确的元素推到屏幕外。然后,在第二次布局过程中,父 LinearLayout 将根据 layout_weight 属性分配任何剩余空间。没有任何剩余可分配,因此没有任何变化。

      但是,如果您在左侧元素上使用 layout_width="0dp",则在第一次传递期间它将没有空间,而您的右侧元素将获得它请求的 80dp。在第二次传递期间,LinearLayout 父级将根据权重分配剩余宽度——因此在这种情况下,左侧元素将接收所有未使用的空间。

      【讨论】:

      • 是的,这就是我正在做的,但它并没有一路扩展。它实际上并没有使用所有可用空间。
      • 我听说您尝试了相反的方法——将权重设置在正确的元素上。我建议您在左侧元素上设置权重。请记住,layout_width="0dp" 确实很重要,因为这里的 match_parent 会强制正确的元素离开屏幕。
      • 没有。 OP 说:The right side of the layout is a small view of fixed width 80dp * 80dp
      • 如果您共享您的布局文件,也许它会消除一些混乱?
      • 实际上,看看 Michael Krause 的回答,这正是我的建议。
      【解决方案3】:

      我相信“match_parent”选项会推出该布局中的任何其他内容。在左侧布局中尝试“fill_parent”,为其他内容留出空间。

      【讨论】:

      • 它们其实是同一个东西,只是改名为developer.android.com/reference/android/view/…
      • @karaokyo:我看到了不同的行为
      • @Jim 老实说,你一定改变了其他东西。正如您在 Android 文档中看到的那样,它们实际上具有相同的值。如果它确实有所作为,我很想看看你的代码。
      猜你喜欢
      • 2015-10-25
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      • 2011-12-04
      相关资源
      最近更新 更多