Intereting Posts
Как избавиться от сильного накала Не удалось создать конвертер для моего класса в Android Retrofit library Могу ли я удалить стиль ссылок по умолчанию для Android по умолчанию в webview Как стиль цвета курсора SearchView в AppCompat Настроить текст кнопки на вопросительный знак Установленное соединение было прервано программным обеспечением вашей хост-машины Ошибка: выполнение выполнено для задачи ': app: transformClassesWithDexForDebug' Appomppat "java.lang.IllegalArgumentException: параметр должен быть потомком этого представления" в ViewGroup.offsetRectBetweenParentAndChild Как включить * .so библиотеку в Android Studio? Не удается увидеть Nexus 6P для отладки Как добавить полосы прокрутки в LinearLayout в Android? Как проверить устройство Android – это экран HDPI или экран MDPI? SMSMessage createFromPdu с дополнительным параметром SetSupportProgressBarIndeterminateVisibility raise java.lang.NullPointerException при использовании с Android 5.0 SDK (API 21) Кнопка обратного вызова кнопки Android Fragment

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 и decalare, это слева от элемента управления A, результатом должен быть элемент управления B, который будет управлять элементом A вправо, правильно?

Solutions Collecting From Web of "RelativeLayout добавляет правило «RelativeLayout.LEFT_OF» не работает"

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

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

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

 m_linearLayout.addView(button2, layoutParams); 

РЕДАКТИРОВАТЬ

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

Возможно, вы могли бы попытаться назвать идентификатор конкретно …

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

Чтобы выполнить это, используйте предопределенный идентификатор вида или объявите его. В папке значений создайте файл 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()); 

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

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

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

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