2012-05-22 3 views
14

У меня есть RelativeLayout, как показано ниже: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, я хочу, чтобы добавить вид слева от ListView, но он не сделал работал:

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), но он может работать только в линейном режиме. Итак, есть ли нормальное решение для работы RelativeLayout.LEFT_OF?

EDIT

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

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

+0

Где появляется представление? – Barak

+0

Relativelayout является основным видом деятельности, и в нем есть место для добавления кнопки. – dreamtale

+0

Я действительно имею в виду, что кнопка просто не появляется или появляется в неприемлемом месте? – Barak

ответ

22

Я думаю, что если я поставил управления А в 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 Границы начинаются с левой границы экрана.

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

+0

Я использую Toshiba AT100 (1280 * 800) и пейзаж, поэтому достаточно места для теста «ниже» и «правого» так же, как и 'left'. Я думаю, что если я поставил элемент управления A в relativelayout, тогда я добавлю управление B и decalare, это слева от элемента управления A, результатом должен быть элемент управления B, который будет управлять элементом A вправо, правильно? – dreamtale

+0

@dreamtale Я неправильно понял ваш вопрос в первый раз. Я отредактировал свой ответ, посмотрим, поможет ли это. – Luksprog

+0

Спасибо за ваш сложный ответ, я сделал это сработало :) – dreamtale

1

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

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

+0

XML показывает макет. – dreamtale

+0

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

+0

См. Мой отредактированный вопрос. – dreamtale

2

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

Эта линия является один я говорю:

m_linearLayout.addView(button2, layoutParams); 

EDIT

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

Может быть, вы могли бы попробовать вызвать ид специально ...

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

Вы имеете в виду, я должен использовать linearlayout? Можете ли вы дать мне более подробную информацию? – dreamtale

+0

Нет, я имею в виду, что вам нужно добавить режим RelativeLayout для RelativeLayout для работы. В этой ссылке указано «m_linearlayout», в котором говорится, что вы пытаетесь добавить представление в LinearLayout вместо RelativeLayout. Поскольку вы не указали, где вы устанавливаете ссылку 'm_linearlayout', я предполагаю, что вы используете соответствующее имя. Если у вас нет 'm_linearlayout = (RelativeLayout) this.findViewById (R.id.parent)' где-то, и в этом случае я бы сказал, что вы выбрали очень плохое ссылочное имя для своего относительного макета. – Barak

+0

Извините за это, я попробовал это в проекте раньше и просто заменил 'LinearLayout' на' RelativeLayout' и не менял имя переменной. Я редактирую вопрос. – dreamtale

1

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

0

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

2

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