Як програмно встановити атрибут layout_align_parent_right кнопки у відносній макеті?


285

У мене є відносний макет, який я створюю програмно:

 RelativeLayout layout = new RelativeLayout( this );
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,
            LayoutParams.WRAP_CONTENT);

Тепер у мене є дві кнопки, які я хочу додати у цьому відносному макеті. Але проблема полягає в тому, що обидві кнопки відображаються зліва від RelatiiveLayout, що перекриваються один на одного.

buttonContainer.addView(btn1);
buttonContainer.addView(btn2);

Тепер я хочу знати, як я можу програмно встановити android:layout_alignParentRight="true"або android:layout_toLeftOf="@id/btn"атрибут кнопок, як це робимо у xml?

Відповіді:


638

Ви можете отримати доступ до будь-якого LayoutParamsз коду, використовуючи View.getLayoutParams. Ви просто повинні бути дуже обізнані в тому, LayoutParamsдо чого ваш доступ. Зазвичай це досягається шляхом перевірки вмісту, ViewGroupякщо він має LayoutParamsвнутрішню дитину, то це саме те, що вам слід використовувати. У вашому випадку це RelativeLayout.LayoutParams. Ви будете використовувати RelativeLayout.LayoutParams#addRule(int verb)іRelativeLayout.LayoutParams#addRule(int verb, int anchor)

До нього можна дістатися за допомогою коду:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)button.getLayoutParams();
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params.addRule(RelativeLayout.LEFT_OF, R.id.id_to_be_left_of);

button.setLayoutParams(params); //causes layout update

1
що робити, якщо якір не має ідентифікатора? params.addRule (RelativeLayout.LEFT_OF, R.id.id_to_be_left_of); TextView tvUserName = новий TextView (акт);
Сен Робсон

18
як щодо додавання ідентифікатора?
користувач2161301

1
Що робити, якщо buttonна RecycleView? Хіба це не проблема додавання однакових чи протилежних правил до одного віджету?
Янош

Він працює лише один раз, якщо я зміню вирівнювання, воно не оновлюється. Чи можу я знати, що може бути проблемою ??
Шшанк Бонг

Я спробував це використати, але в моєму коді воно стає червоним addRule?

12
  1. вам потрібно створити і ідентифікувати для кнопок, які вам потрібні: btn1.setId(1);
  2. ви можете використовувати змінну params для додавання параметрів у ваш макет, я думаю, що метод є addRule(), ознайомтеся з документами для android java для цього LayoutParamsоб’єкта.

Я дуже вдячний за будь-який фрагмент коду. Я не знаходжу жодного методу в кнопці.
Фахад Алі

Встановлення ідентифікатора не допомагає, оскільки він очікує справжнього ідентифікатора ресурсу, а не просто числа, оскільки setId позначається за допомогою @IdRes.
Кевін Тан

це вже тоді нове, раніше ви могли взяти номер ресурсу з макетів, наприклад, і використовувати його як базу для ідентифікатора ресурсу, який не зіткнеться. Я здогадуюсь, Google повинен був заблокувати цей /
codeScriber

6

Для додавання RelativeLayoutатрибута, значення якого є істинним або помилковим, використовується 0для хибного та RelativeLayout.TRUEдля істинного:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) button.getLayoutParams()
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE)

Не має значення, додано чи ні атрибут, ви все одно використовуєте його addRule(verb, subject)для ввімкнення / відключення. Однак після API 17, який ви можете використовувати, removeRule(verb)це лише ярлик addRule(verb, 0).


0

Версія Котліна:

Використовуйте ці розширення з функціями infix, які спрощують пізніші виклики

infix fun View.below(view: View) {
    (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.BELOW, view.id)
}

infix fun View.leftOf(view: View) {
    (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.LEFT_OF, view.id)
}

infix fun View.alightParentRightIs(aligned: Boolean) {
    val layoutParams = this.layoutParams as? RelativeLayout.LayoutParams
    if (aligned) {
        (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
    } else {
        (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0)
    }
    this.layoutParams = layoutParams
}

Потім використовуйте їх як виклики функцій інфіксації:

view1 below view2
view1 leftOf view2
view1 alightParentRightIs true

Або ви можете використовувати їх як звичайні функції:

view1.below(view2)
view1.leftOf(view2)
view1.alightParentRightIs(true)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.