【问题标题】:Android LinearLayout and weights issueAndroid LinearLayout 和权重问题
【发布时间】:2019-05-24 18:43:28
【问题描述】:

我在使用 Android 中的 LinearLayout 和权重时遇到问题。我想要一个水平的 LinearLayout 来容纳 2 个垂直的 LinearLayouts,它们由一个具有 9 个补丁背景的 View 分隔,作为 2 个垂直的 LinearLayouts 之间的分隔符。

像这样:(外框是外LinearLayout,中间双线是我的9个补丁分隔符。)

----------------------------
|    one    ||    three    |
|    two    ||    four     |
----------------------------

持续发生的是第一个内部 LinearLayout 以最小宽度显示其内容(好像它的宽度是 wrap_content),然后剩余空间被拉伸以填充其余部分的分隔符视图占用外部线性布局。第二个内部 LinearLayout 根本不显示。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:weightSum="2" >    
    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center_horizontal"
        android:layout_weight="1" >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="one" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="two" />
    </LinearLayout>

    <View
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:background="@drawable/divider_vertical"
        android:layout_weight="0" />

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center_horizontal"
        android:layout_weight="1" >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="three" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="four" />
    </LinearLayout>

</LinearLayout>

我在这里做错了什么?我一生都无法弄清楚为什么中间 View 占用了所有空间,而没有为第二个内部 LinearLayout 留下任何空间。

如果我为 9-patch 视图指定特定的 px 或 dp 宽度,我可以让它工作,但我真的希望它可以工作而不必指定这个宽度。这样,如果我决定更改我的 9-patch 可绘制对象,我就不必手动更新宽度。

【问题讨论】:

  • 你有解决办法还是还是同样的问题
  • 您是否尝试过为分隔线视图设置一个实际宽度?说 10dp 之类的?
  • 是的。给分隔线一个实际的宽度可以解决这个问题,但我正在寻找一个不涉及这个的解决方案。查看我对原始帖子的更新。

标签: android android-layout android-linearlayout android-view android-layout-weight


【解决方案1】:

试试这个布局

更新布局

<LinearLayout
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:gravity="center_horizontal"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="one" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="two" />
</LinearLayout>

<View
    android:layout_width="1dp"
    android:layout_height="88dp"
    android:background="@android:color/darker_gray" />

<LinearLayout
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:gravity="center_horizontal"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="three" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="four" />
</LinearLayout>

【讨论】:

  • 这确实有效(指定一个特定的 layout_width),但我宁愿不必指定这个宽度,以防我决定使用不同的可绘制 9-patch 作为我的分隔符,因为我必须手动相应地更新此宽度。我已经在我原来的问题中更新了这个。
  • 我会将其标记为解决方案,因为这就是我所采用的。想不出更好的方法来做到这一点。请注意,我不必明确设置分隔线的高度,我可以将其保留在 match_parent。另外,我为 layout_width 使用了一个维度,其中我有一个精确的像素值作为分隔线的宽度,因为对于不同的屏幕分辨率,这个分隔线实际上有不同的图像资产(对于不同的屏幕分辨率,这个维度也有不同的像素值以及)。
【解决方案2】:

在这里更新并尝试

<View
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:background="@drawable/divider_vertical"
 />

【讨论】:

    【解决方案3】:
    • 从父 LinearLayout 中移除 weightSum="2"
    • 从 9 补丁视图中删除 android:layout_weight="0"

    【讨论】:

    • 我知道添加 weightSum 和 android:layout_weight="0" 是不必要的,但删除它们不会改变任何东西
    【解决方案4】:

    你的 9 补丁有多大? 9 个补丁的可拉伸区域不可收缩 - 资产文件的宽度将决定它尝试在您的 LinearLayout 中占用的最小空间。

    【讨论】:

    • 9 补丁只有 5 x 3 像素。我已经正确设置了 9 个补丁,所有 4 个边缘和正确的位置都有线条
    【解决方案5】:

    如下设置布局权重

    记住默认情况下父级的 weightSum 设置为子级的 layout_weight sum

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >    
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:gravity="center_horizontal"
            android:layout_weight="3" >
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="one" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="two" />
        </LinearLayout>
    
        <View
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="@drawable/divider_vertical"
            android:layout_weight="1" />
    
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:gravity="center_horizontal"
            android:layout_weight="3" >
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="three" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="four" />
        </LinearLayout>
    
    </LinearLayout>
    

    当然,您可以尝试权重值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-29
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 2016-11-29
      • 1970-01-01
      • 2018-03-22
      相关资源
      最近更新 更多