我正在尝试使用以下显示逻辑在Android中实现布局:
[ Left ][ Right ]
[ Bottom ]
Left
有时比Bottom
宽,有时更窄。当Bottom
宽于Left
时,我希望Right
一直延伸到Bottom
的右边缘;当Left
更宽时,我希望Right
为0px宽。
Left
和Bottom
的性质并不重要;它们都是外包式的。
我在顶级尝试过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。
答案 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中使用短文本)
第二种情况:(使用Left TextView的长文本,但文本包含在一行中)
第三种情况:(文字超过1行)
希望这有帮助。
P.S:由于外部布局的高度,第二行中的textview文本被剪掉了一些,我保留在你的问题中。
修改强>
这是输出,而第二行中的文本比第一行中的文本长。
答案 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>