RelativeLayout - 定位项目低于两个视图中的最低点

时间:2012-04-09 10:23:02

标签: android android-ui

我在RelativeLayout中有一个TextView(width: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。可能吗?或者,定位此视图的最佳方法是什么?

由于

2 个答案:

答案 0 :(得分:2)

为什么不使用tablelayout?它完全符合你想要的两行。

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

像这样:

<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>

答案 1 :(得分: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()

即可