如果有的话,使视图占用剩余的可用空间

时间:2014-09-26 12:33:37

标签: android android-layout

我正在尝试使用以下显示逻辑在Android中实现布局:

[ Left ][ Right ]
[    Bottom     ]

Left有时比Bottom宽,有时更窄。当Bottom宽于Left时,我希望Right一直延伸到Bottom的右边缘;当Left更宽时,我希望Right为0px宽。

LeftBottom的性质并不重要;它们都是外包式的。

我在顶级尝试过LinearLayout和RelativeLayout。无论我做什么,最外层容器的宽度都由Bottom驱动而不考虑Left,或者视图不合理地延伸,或者Right始终为零宽度。

这是我对RelativeLayout的最新尝试:

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="78dp"
    >

    <TextView
         android:id="@+id/Left"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="Left"/>

    <View
        android:id="@+id/Right"
        android:layout_width="0dp"
        android:layout_toRightOf="@+id/Left"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_height="1px"
        android:layout_marginTop="32dp"
        android:background="#ffffffff"/>

    <TextView
        android:id="@+id/Bottom"
        android:layout_width="wrap_content"
        android:layout_height="23dp"
        android:layout_below="@+id/Left"
        android:layout_alignParentLeft="true"
        android:textColor="#ffff00"
        android:text="Hello"
        android:lines="1"/>
</RelativeLayout>

它没有按预期工作; Right视图无法合理延伸。

在4.4.2仿真器上进行测试。如果重要的话,整个事情都在ScrollView中。目标SDK是17。

2 个答案:

答案 0 :(得分:1)

如果我正确地理解了你的问题,那么这应该可行:

我将Left和Right放在父布局中,并将另一个textview放在该父容器下面。相应地设定高度。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="78dp"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.tempp.MainActivity" >

    <RelativeLayout
        android:id="@+id/upper"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/Left"
            android:layout_width="wrap_content"
            android:layout_height="32dp"
            android:text="Here I have written some text which is long" />

        <View
            android:id="@+id/Right"
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:layout_alignParentTop="true"
            android:layout_marginTop="32dp"
            android:layout_toRightOf="@+id/Left"
            android:background="#000000" />
    </RelativeLayout>

    <TextView
        android:id="@+id/Bottom"
        android:layout_width="wrap_content"
        android:layout_height="23dp"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/upper"
        android:lines="1"
        android:text="Hello"
        android:textColor="#ffff00" />

</RelativeLayout>

从此我得到以下输出:

第一种情况:(在Left TextView中使用短文本)

enter image description here

第二种情况:(使用Left TextView的长文本,但文本包含在一行中)

enter image description here

第三种情况:(文字超过1行)

enter image description here

希望这有帮助。

P.S:由于外部布局的高度,第二行中的textview文本被剪掉了一些,我保留在你的问题中。

修改

这是输出,而第二行中的文本比第一行中的文本长。

enter image description here

答案 1 :(得分:0)

我认为自定义视图可以解决您的问题。我稍微改变了你的布局并包裹在一个自定义的相对布局中。我检查了儿童OnLayout事件的自定义相对布局的宽度。如果左边比底部宽,右边不会改变。否则,右边的宽度设置为宽度差。保留一个布尔值仅用于执行此操作一次。否则,更改布局会导致对OnLayout方法的递归调用。

这是自定义类:

public class CustomRelativeLayout extends RelativeLayout {

private boolean mIsLayoutSet = false;

public CustomRelativeLayout(Context context) {
    super(context);
}

public CustomRelativeLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public CustomRelativeLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);

    if (!mIsLayoutSet) {
        View left = findViewById(R.id.Left);
        View right = findViewById(R.id.Right);
        View bottom = findViewById(R.id.Bottom);

        int leftWidth = left.getWidth();
        int bottomWidth = bottom.getWidth();

        if (bottomWidth > leftWidth) {
            LayoutParams params = (LayoutParams) right.getLayoutParams();
            params.width = bottomWidth - leftWidth;
            right.setLayoutParams(params);
        }

        mIsLayoutSet = true;
    }
}

}

以及自定义布局的用法:

<com.rotasoftc.myapps.CustomRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
    android:id="@+id/Left"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Left"/>

<View
    android:id="@+id/Right"
    android:layout_width="0dp"
    android:layout_toRightOf="@+id/Left"
    android:layout_height="15px"
    android:background="@android:color/black"
    android:layout_marginTop="7dp"/>

<TextView
    android:id="@+id/Bottom"
    android:layout_width="wrap_content"
    android:layout_height="23dp"
    android:layout_below="@+id/Left"
    android:layout_alignParentLeft="true"
    android:textColor="#ffff00"
    android:text="HelloHelloHelloHello"
    android:lines="1"/>
</com.rotasoftc.myapps.CustomRelativeLayout>