2

我在 RelativeLayout 中有一个 TextView(宽度:fill_parent),我想确保它位于其上方并排的两个视图下方,具有动态宽度和高度。这意味着,有时左视图更高,有时右视图更高。

我试图设置两个“低于”参数,但这当然是不允许的。我尝试通过代码修改它(将 XML 设置在 txt TextView 下面,img 是它旁边的 ImageView):

if (txt.getHeight() + txt.getTop() < img.getHeight() + img.getTop()) {
                    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
                    params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
                    params.addRule(RelativeLayout.BELOW, R.id.image);
                    txtDetails.setLayoutParams(params);
                }

(txtDetails 是我想要在两个视图下方的那个)。

当这不起作用(没有任何改变)时,我将 txtDetails 放在它自己的 RelativeLayout 中,它位于包含两个视图并且有效的 RelativeLayout 下方。但是,我觉得 RL 应该能够处理这种情况,而无需创建新的 RL。可能吗?或者定位这种观点的最佳方式是什么?

谢谢

4

2 回答 2

2

为什么不使用表格布局?它在 2 行中完全符合您的要求。

首先在一行中添加两个变量视图,然后添加另一行包含您的文本视图。

像这样:

<TableLayout
    android:id="@+id/center"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >
    <TableRow >
    <TextView
        android:id="@+id/textView1"
        android:layout_width="150sp"
        android:layout_height="wrap_content"
        android:text="@string/lorem_short" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="150sp"
        android:layout_height="wrap_content"
        android:layout_marginRight="15dp"
        android:text="@string/lorem_long" />
    </TableRow>
    <TableRow>
    <TextView
        android:id="@+id/textView3"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5sp"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />
    </TableRow>
</TableLayout>
于 2012-04-09T10:56:53.670 回答
1

您的代码可能存在问题:
您正在视图上调用 getHeight(),如果尚未完成布局传递,则可能会返回 0。您应该将整个代码放在 GlobalLayoutListener 中,如下所示:

getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
   @Override
   public void onGlobalLayout() {
       // your code here...
       txt.requestLayout(); // Add this to ensure your changes are applied.
   }
}

PS。你可以打电话txt.getBottom()而不是txt.getHeight() + txt.getTop()

于 2012-04-09T10:27:42.050 回答