RelativeLayout — позиционирование элемента ниже самого нижнего из двух представлений

У меня есть TextView (ширина: fill_parent) в RelativeLayout, который я хочу убедиться, что он находится под двумя представлениями над ним, которые расположены рядом, с динамической шириной и высотой. Это означает, что иногда вид слева выше, а иногда выше вид справа.

Я попытался установить два параметра «ниже», но это, конечно, не разрешено. Я попытался изменить его с помощью кода (с 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. Является ли это возможным? Или как лучше расположить этот вид?

Спасибо


person StackOverflowed    schedule 09.04.2012    source источник


Ответы (2)


Возможная проблема с вашим кодом:
вы вызываете 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()

person saarraz1    schedule 09.04.2012

почему бы не использовать tablelayout? Он делает именно то, что вы хотите в 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>
person Mirko Lindner    schedule 09.04.2012