Вопрос по android-layout, android – RelativeLayout добавить правило «RelativeLayout.LEFT_OF» не работает

15

У меня есть относительный план, как показано ниже:

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

только если я установилalignParentRight, это будет работать. Это ошибка Android или я что-то упустил?

Я всегда стараюсьaddView(View child, int index, LayoutParams params), но это может работать только в линейном макете. Так есть ли нормальное решение, чтобы сделатьRelativeLayout.LEFT_OF Работа?

EDIT

я пыталсяRelativeLayout.BELOW а такжеRelativeLayout.RIGHT_OFи они работали отлично, значит, у меня недостаточно места, чтобы получить кнопку? Я пытался дать больше места, но это все еще не работает.

Я использую Toshiba AT100 (1280 * 800) и альбомную ориентацию, поэтому места достаточно. Тестовое заданиеbelow а такжеright так же, какleft, Я думаю, что если я помещу элемент управления A в относительное расположение, то я добавляю элемент управления B и декаляризирую его слева от элемента управления A, в результате элемент управления B будет перемещать элемент управления А вправо, верно?

Я имею в виду, кнопка просто не появляется, или появляется в неподходящем месте? Barak
Где появляется вид? Barak
Относительное расположение является основным видом действия, и в нем есть место для добавления кнопки. dreamtale
Кнопка не появляется. dreamtale

Ваш Ответ

6   ответов
0

а не обычный сгенерированный идентификатор Android (например,R.id.my_id), убедитесь, что идентификатор не равен 0 (или отрицательный), в противном случае правило будет игнорироваться.

3

ID или объявить один. Вvalues folder Создайтеids.xml затем добавитьItem как это:

<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 T,extView(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());
3

то это потому, что вы добавляете виджет в LinearLayout, поэтому теги для RelativeLayout игнорируются.

Это та строка, о которой я говорю:

m_linearLayout.addView(button2, layoutParams);

EDIT

Ты говоришьalignParentRight работает ... единственное различие заключается в том, что он не принимает параметр привязки. возможноm_listView.getId() не возвращает правильный идентификатор. Вы могли бы пройтись с отладчиком и посмотреть, возвращает ли он правильное значение.

Может быть, вы могли бы попробовать позвонить по номеру телефона

layoutParams.addRule(RelativeLayout.LEFT_OF, R.id.list);
Обновил мой ответ.
Нет работал до сих пор. Я обновляю вопрос. dreamtale
Вы имеете в виду, что я должен использовать linearlayout? Можете ли вы дать мне больше деталей? dreamtale
Извините за это, я попробовал это в предыдущем проекте, и просто заменилLinearLayout вRelativeLayout и не меняйте имя переменной. Я должен отредактировать вопрос. dreamtale
Нет, я имею в виду, что вам нужно добавить представление в правила RelativeLayout для работы RelativeLayout. Это мнение говорит, чтоm_linearlayout, который говорит мне, что вы пытаетесь добавить представление к LinearLayout вместо RelativeLayout. Поскольку вы не показали, где вы устанавливаетеm_linearlayout ссылка, я предполагаю, что вы используете подходящее имя. Если у вас нетm_linearlayout = (RelativeLayout) this.findViewById(R.id.parent) где-то, и в этом случае я бы сказал, что вы выбрали очень плохое справочное имя для вашего относительного макета.
1

особенно для нового представления объекта.

23

then i add control B and declare it's on the left of the control A, the result should be the control B will push the control A to its right, right?

Ваше предположение неверно, элемент управления A не будет сдвинут вправо, если вы не указали это с помощьюRelativeLayout.LayoutParams править.RelativeLayout размещает его дочерние элементы друг над другом, начиная с верхнего левого угла экрана, если вы не указали для них правила размещения. Когда вы добавляетеView А кRelativeLayout без каких-либо правил (какlayout_alignParentRight) он будет размещен, начиная с верхнего левого угла экрана. Затем, когда вы добавляетеView Б, правилоto_leftOf будет применяться к этомуView положение, но это правило ничего не значит дляView А кто будет поддерживать свою позицию на экране. Это сделаетView B будет место слева отView А за пределами экрана какView Границы начинаются от левой границы экрана.

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 переместить его вправо (с двумя последними строчками из кода выше).

Спасибо за ваш сложный ответ, я сделал это сработало :) dreamtale
Я использую Toshiba AT100 (1280 * 800) и альбомную, так что места достаточноbelow а такжеright так же, какleft, Я думаю, что если я помещу элемент управления A в относительное расположение, то я добавлю элемент управления B и декаляризирую его слева от элемента управления A, в результате элемент управления B будет толкать элемент управления А вправо, верно? dreamtale
@dreamtale Я неправильно понял твой вопрос в первый раз. Я отредактировал свой ответ, посмотрим, поможет ли это.
1

m_listView кRelativeLayout или жеm_listViewвидимость будетGONE.

Можете ли вы проверить это?

Смотрите мой отредактированный вопрос. dreamtale
XML показывает макет. dreamtale
Как я вижу, вы устанавливаете параметры макета относительного макета, но вы добавляете кнопку в линейном макете. Eiter использует LinearLayout.LayoutParams вместо RelativeLayout.LayoutParams или вызывает метод addView экземпляра RelativeLayout.

Похожие вопросы