2016-12-21 3 views
1

Попытка выполнить некоторое выравнивание гибким TextView в контейнере RelativeLayout, который может отличаться по высоте. Кажется, что это не проблема, и тем не менее, он не выравнивается нигде рядом с ним.RelativeLayout layout_alignBottom TextView не работает должным образом

Следующий простой код:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

<-- Stands for any view that would force minimum height, e.g. an avatar image --> 
<View 
    android:layout_width="10dp" 
    android:layout_height="73dp" 
    android:background="#300f"/> 

<TextView 
    android:id="@+id/t1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:text="ceterum censeo carthaginem esse delendam"/> 

<View 
    android:layout_width="40dp" 
    android:layout_height="wrap_content" 
    android:layout_alignTop="@+id/t1" 
    android:layout_alignBottom="@+id/t1" 
    android:background="#6f00"/> 

</RelativeLayout> 

Это результат:

enter image description here

Можно, очевидно, ожидать, что красный прямоугольник будет выравнивать по вертикали с текстом. Но это не так.

Что пошло не так ...

+0

Попробуйте использовать android: layout_below = "@ + id/t1". –

+0

добавить андроид: layout_centerVertical = "true" к вашему красному цвету макет – Noorul

+0

@Ahamed Желаю! Но я не могу. Он должен быть выровнен, высоты должны выравниваться, например, когда текст длинный, а линия растет выше ... – Meymann

ответ

0

пользователь андроида: layout_below = "@ ID/Идентификатор"

<View 
    android:layout_width="40dp" 
    android:layout_height="wrap_content" 
    android:layout_alignTop="@+id/t1" 
    android:layout_below="@+id/t1" 
    android:background="#6f00"/> 

Я надеюсь, что это работа

+0

Абсолютно нет ... Это ограничения снизу, но не в том месте. Это сделает его просто исчезающим. – Meymann

0
try using the attribute "android:layout_below". For example: 
... 
<View android:id="@+id/v1" 
    android:layout_width="10dp" 
    android:layout_height="73dp" 
    android:background="#300f"/> 

<TextView 
    android:id="@+id/t1" 
    android:layout_below="@+id/v1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:text="ceterum censeo carthaginem esse delendam"/> 

... 
+0

Пожалуйста ... Это круговая зависимость. И это не сработает, потому что цель состоит в том, чтобы заставить его вести себя наоборот. – Meymann

+0

Затем заверните текстовое изображение и второе представление в виде linearLayout и установите представление linearlayout под первым видом ... duh! – Paul

+0

LinearLayout стоит в производительности, и вы не можете выровнять другие вещи под своими детьми. Это упрощенный случай. Короче говоря, недостаточно хорошего, если вы хотите выровнять по нескольким осям :-( – Meymann

0

Пожалуйста, попробуйте это ниже.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 
    <View android:id="@+id/some_view_id" 
     android:layout_width="10dp" 
     android:layout_height="73dp" 
     android:background="#300f"/> 

    <TextView 
     android:id="@+id/t1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true" 
     android:layout_below="@id/some_view_id" 
     android:text="varying text view here that can \n go for multiple lines and not disturb the one below"/> 

    <View 
     android:layout_width="40dp" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/t1" 
     android:background="#6f00"/> 
</RelativeLayout> 
+0

Очевидно, что нет, вы бы не захотели поставить его ниже, вы хотите поместить его в строку – Meymann

+0

Вы имеете в виду, все 3 в одной строке? – Sri

+0

Я просто хочу сказать, что хочу выровнять нижнюю часть красной с нижней частью текста. Вот что такое alignBottom :-) – Meymann

0

Попробуйте этот код может решить вашу проблему:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:background="#ffffff" > 

<View 
    android:layout_width="10dp" 
    android:layout_height="73dp" 
    android:background="#300f" /> 

<TextView 
    android:id="@+id/t1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:text="ceterum censeo carthaginem esse delendam" /> 

<LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

    <View 
     android:layout_width="10dp" 
     android:layout_height="73dp" 
     android:background="#6f00" /> 
</LinearLayout> 

</RelativeLayout> 
+0

???? Ты упустил мой плохой выровненный вид! – Meymann

+0

@Meymann ... Я не могу очистить, чтобы определить, какова ваша точная проблема! ... Можете ли вы объяснить, что нужно сделать, и как должен выглядеть ваш макет. Спасибо заранее – HsRaja

+0

Просто, текстовое изображение по центру, а красное изображение выровнено по низу. – Meymann

0

Используйте android:layout_toEndOf как этого

<TextView 
    android:id="@+id/t1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:text="ceterum censeo carthaginem esse delendam"/> 

<View 
    android:layout_width="40dp" 
    android:layout_height="wrap_content" 
    android:layout_toEndOf="@+id/t1" 
    android:layout_alignBottom="@+id/t1" 
    android:background="#6f00"/> 
+0

To End Of - это горизонтальное ограничение! – Meymann

+0

Когда вы его используете, красный прямоугольник будет выровнен с TextView и помещен за ним, если вы хотите использовать его спереди 'android: layout_toStartOf' –

+0

Горизонтальное расположение не имеет значения прямо сейчас. Я говорил о вертикальном выравнивании, а не о горизонтальном – Meymann

0

Он должен сделать с вами относительной высотой макета устанавливается на wrap_content.

из RelativeLayout документации:

Обратите внимание, что вы не можете иметь циклическую зависимость между размером в RelativeLayout и положение своих детей. Например, у вас не может быть RelativeLayout, высота которого установлена ​​на WRAP_CONTENT, а дочерний элемент - ALIGN_PARENT_BOTTOM.

Так как вы установили, что высота match_parent или, проще, как Ahamed писал добавить андроида: layout_centerVertical = «истина» в свой красный цвет макет

+0

Чувак, нет круговой зависимости. Текстовый вид уже выровнен по центру, а красный - в нижней части textView. – Meymann

+0

Пожалуйста, прочтите код. Круговой зависимости нет. Текстовый вид уже выровнен по центру, а красный - в нижней части textView. Просто как тот. Итак, зависимость: h (RelativeLayout) = h (синий вид), потому что это wrap_content h (TextView) обернуто его контентом. Позиция (TextView) центрированаВертикально h (RedView) является абсолютным. Позиция (RedView) - это нижняя часть текста. Вот и все. Нет круговой зависимости. Дерево зависимостей: RedView-> TextView-> RelativeLayout-> BlueView Высота (RelativeLayout) = max (дети) Простой в этом. – Meymann

0

Попробуйте это решение. надеюсь это поможет.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 


    <View 
     android:layout_width="10dp" 
     android:layout_height="73dp" 
     android:background="#300f"/> 
    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true"> 

     <TextView 
     android:id="@+id/t1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="ceterum censeo carthaginem esse delendam"/> 

     <View 
     android:layout_width="40dp" 
     android:layout_height="wrap_content" 
     android:layout_alignTop="@+id/t1" 
     android:layout_alignBottom="@+id/t1" 
     android:background="#6f00"/> 
    </RelativeLayout> 

</RelativeLayout> 
+0

Спасибо. Я тоже хочу. Это была моя оригинальная попытка: (Вся правда заключается в том, что вместо 2-го внутреннего представления мне пришлось вставить ImageView (упростил пример как можно больше для вопроса). Не так много успеха. У меня такое чувство, что RelativeLayout doesn 't рассчитывать зависимости должным образом, если они не являются прямыми. Они должны, так как они измеряют цикл, а затем позиционируют. Это должно решить wrap_content vs centerVertical pseudo взаимная зависимость. Может понадобиться копаться в коде Android для этого. – Meymann

+0

- это решение ОК для вас? – Noorul

+0

Нет. См. Мой комментарий. Это был исходный код (вместо этого вместо ImageView). Я упростил его для вопроса. – Meymann

Смежные вопросы