RelativeLayout добавить правило «RelativeLayout.LEFT_OF» не работает

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

<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 будет перемещать элемент управления А вправо, верно?

Ответы на вопрос(6)

Для этого используйте предопределенный вид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());

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

setId перед выравниванием вызывается, особенно для нового представления объекта.

Я думаю, что вы могли забыть добавитьm_listView кRelativeLayout или жеm_listViewвидимость будетGONE.

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

Решение Вопроса

I think If i put an control A in the relativelayout, 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 переместить его вправо (с двумя последними строчками из кода выше).

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

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

m_linearLayout.addView(button2, layoutParams);

EDIT

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

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

layoutParams.addRule(RelativeLayout.LEFT_OF, R.id.list);

Ваш ответ на вопрос