Как программно установить атрибут 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 = new TextView (act);
Сент-Робсон
18
как насчет добавления идентификатора?
user2161301 10.01.15
1
Что делать, если buttonна RecycleView? Разве это не проблема добавления одинаковых или противоположных правил к одному и тому же виджету?
Янос
Он работает только один раз, если я меняю выравнивание, он не обновляется. Могу ли я знать, в чем может быть проблема?
Шшанк Бхонг
Я пытался использовать это, но он становится красным в моем коде для addRule?
12
  1. вам нужно создать и идентифицировать кнопки, на которые вы хотите сослаться: btn1.setId(1);
  2. Вы можете использовать переменную params для добавления параметров в ваш макет, я думаю, что метод addRule(), проверить документы Java для Android для этого LayoutParamsобъекта.
codeScriber
источник
Я был бы очень признателен за любой кусок кода. Я не нахожу какой-либо метод в кнопке.
Фахад Али
Установка идентификатора не помогает, поскольку она ожидает реального идентификатора ресурса, а не просто числа, так как setId аннотируется с помощью @IdRes.
Кевин Тан
тогда это ново, в прошлом вы могли, например, взять номер ресурса из макетов и использовать его в качестве основы для идентификатора ресурса, который не будет сталкиваться. Я предполагаю, что Google должен был заблокировать это /
codeScriber
6

Для добавления RelativeLayoutатрибута со значением true или false используйте 0false и RelativeLayout.TRUEдля 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 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)
Махмуд
источник