RelativeLayout добавляет правило "RelativeLayout.LEFT_OF" не работает
У меня есть relativeLayout, как показано ниже:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:id="@+id/parent" >
<ListView
android:layout_width="360dp"
android:layout_height="600dp"
android:id="@+id/list"
android:inputType="text"
android:maxLines="1"
android:layout_margin="50dp"
android:layout_alignParentRight="true"
/>
</RelativeLayout>
В java-коде я хочу добавить представление слева от списка, но оно не сработало:
m_relativeLayout = (RelativeLayout)findViewById(R.id.parent);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.LEFT_OF, m_listView.getId());
Button button2 = new Button(this);
button2.setText("I am button 2");
m_relativeLayout.addView(button2, layoutParams);
только если я установил listview в alignParentRight, он будет работать. Это ошибка андроида, или я чего-то не хватает?
Я всегда стараюсь addView(View child, int index, LayoutParams params)
, но он может работать только в linearlayout. Итак, есть ли нормальное решение для работы RelativeLayout.LEFT_OF
?
ИЗМЕНИТЬ
Я пробовал RelativeLayout.BELOW
и RelativeLayout.RIGHT_OF
, и они отлично работали, значит, мне не хватает места, чтобы получить кнопку? Я попытался предоставить больше места, но он все еще не работает.
Я использую Toshiba AT100 (1280 * 800) и ландшафт, поэтому достаточно места. Проверьте below
и right
так же, как и left
. Я думаю, что если я поставлю элемент управления A в relativelayout, то я добавлю элемент управления B и декалирую его слева от элемента управления A, результатом должен быть элемент управления B, который будет управлять A вправо, право?
Ответы
Ответ 1
Я думаю, что если я поставлю элемент управления A в relativelayout, тогда я добавлю элемент управления B и объявляю его слева от элемента управления A, результатом должен быть элемент управления B, который будет управлять элементом A вправо, правильно?
Ваше предположение неверно, элемент управления A не будет сдвигаться вправо, если вы не указали это с помощью правила RelativeLayout.LayoutParams
. RelativeLayout
помещает своих детей один друг на друга, начиная с верхнего левого угла экрана, если вы не укажете для них правила размещения. Когда вы добавите View
A в RelativeLayout
без каких-либо правил (например, layout_alignParentRight
), он будет помещен начиная с левого верхнего угла экрана. Затем, когда вы добавляете View
B, правило to_leftOf
будет применяться к этой позиции View
, но это правило ничего не значит для View
A, который будет сохранять свою позицию на экране. Это приведет к тому, что View
B будет располагаться слева от View
A, но за пределами экрана как View
A границы начинаются с левой границы экрана.
Button
будет располагаться слева от ListView
, когда вы используете layout_alignParentRight="true"
, потому что теперь есть пространство, чтобы фактически увидеть Button
(он больше не снаружи). addView(View child, int index, LayoutParams params)
работает в LinearLayout
, потому что LinearLayout
упорядочивает свои дочерние элементы в строке или столбце (в зависимости от ориентации), поэтому, когда вы добавляете View
в определенную позицию, он будет выталкивать другой Views
после него справа или ниже (в зависимости от ориентации) (нет относительного расположения представлений в LinearLayout
, единственное правило состоит в том, что дети идут один за другим).
Начиная с ListView
без каких-либо правил, установленных на нем, вот пример того, как заставить Button
появиться слева от ListView
:
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
Button button2 = new Button(this);
button2.setText("I am button 2");
button2.setId(1000);
m_relativeLayout.addView(button2, layoutParams);
RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) m_listView
.getLayoutParams();
rlp.addRule(RelativeLayout.RIGHT_OF, button2.getId());
Кнопка будет добавлена как нормальная к экрану, и она появится, начиная с левого верхнего угла экрана. Без двух строк из кода выше Button
и ListView
будут перекрываться, поскольку это нормальное поведение RelativeLayout
для детей без каких-либо правил на них. Затем мы явно изменяем положение ListView
, чтобы переместить его вправо (с двумя последними строками из кода выше).
Ответ 2
Если ваши имена переменных являются ориентировочными, это связано с тем, что вы добавляете виджет в LinearLayout, поэтому теги для RelativeLayout игнорируются.
Эта строка является той, о которой я говорю:
m_linearLayout.addView(button2, layoutParams);
ИЗМЕНИТЬ
Вы говорите, что alignParentRight
работает... единственное отличие в том, что ot не принимает параметр привязки. Возможно, m_listView.getId()
не возвращает правильный id. Вы можете пройти через отладчик и посмотреть, вернет ли он правильное значение.
Возможно, вы могли бы попытаться вызвать идентификатор конкретно...
layoutParams.addRule(RelativeLayout.LEFT_OF, R.id.list);
Ответ 3
Чтобы выполнить это, используйте предопределенный вид ID или объявите его. В папке значения создайте ids.xml, затем добавьте Элемент, как это:
<item name="imageViewID" type="id"/>
используйте этот идентификатор в своем коде, где вы создаете новый экземпляр вида следующим образом:
RelativeLayout layout=new RelativeLayout(context);
ImageView imageView = new ImageView(context);
imageView.setId(R.id.imageViewID);
RelativeLayout.LayoutParams layoutParams = new LayoutParams(50, 50);
layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
layout.addView(imageView, layoutParams);
TextView textView = new TextView(context);
RelativeLayout.LayoutParams textViewParams= new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
textViewParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
textViewParams.addRule(RelativeLayout.BELOW, imageView.getId());
layout.addView(nameView, nameLayoutParams);
или мы можем напрямую использовать эту функцию View.generateViewId() для выполнения этой функции. Вот так:
imageView.setId(View.generateViewId());
Ответ 4
Я думаю, вы могли бы забыть добавить m_listView
в RelativeLayout
или m_listView
видимость будет GONE
.
Можете ли вы проверить это?
Ответ 5
setId перед вызовом align, особенно для нового представления объекта.
Ответ 6
Если вы используете пользовательский идентификатор, а не обычный сгенерированный идентификатор Android (например, R.id.my_id
), убедитесь, что идентификатор не равен 0 (или отрицательный), иначе правило будет проигнорировано.