Jak programowo ustawić atrybut layout_align_parent_right przycisku w układzie względnym?

285

Mam względny układ, który tworzę programowo:

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

Teraz mam dwa przyciski, które chcę dodać w tym układzie względnym. Problem polega jednak na tym, że oba przyciski są pokazane po lewej stronie nakładki RelatiiveLayout.

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

Teraz chcę wiedzieć, jak mogę programowo ustawić android:layout_alignParentRight="true„lub android:layout_toLeftOf="@id/btn"atrybut przycisków, tak jak robimy to w xml?

Fahad Ali
źródło

Odpowiedzi:

638

Możesz uzyskać dostęp do dowolnego LayoutParamsz kodu za pomocą View.getLayoutParams. Musisz tylko być bardzo świadomy tego, do czego LayoutParamsmasz dostęp. Zwykle osiąga się to, sprawdzając, ViewGroupczy zawiera ono LayoutParamswewnętrzne dziecko, a więc tego należy użyć. W twoim przypadku to jest RelativeLayout.LayoutParams. Będziesz używać RelativeLayout.LayoutParams#addRule(int verb)iRelativeLayout.LayoutParams#addRule(int verb, int anchor)

Możesz się do niego dostać za pomocą kodu:

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
Rich Schuler
źródło
1
co jeśli kotwica nie ma identyfikatora? params.addRule (RelativeLayout.LEFT_OF, R.id.id_to_be_left_of); TextView tvUserName = nowy TextView (akt);
Saint Robson
18
co powiesz na dodanie identyfikatora?
user2161301
1
Co jeśli buttonjest na RecycleView? Czy to nie problem z dodawaniem tych samych lub przeciwnych reguł do tego samego widżetu?
János
Działa tylko raz, jeśli zmienię wyrównanie, nie będzie aktualizowany. Czy mogę wiedzieć, co może być problemem?
Shshank Bhong
Próbowałem tego użyć, ale w moim kodzie jest czerwony addRule?
12
  1. musisz utworzyć i podać przyciski, do których chcesz się odwoływać: btn1.setId(1);
  2. możesz użyć zmiennej params, aby dodać parametry do swojego układu, myślę, że metodą jest addRule()sprawdzenie dokumentacji java dla Androida dla tego LayoutParamsobiektu.
codeScriber
źródło
Byłbym bardzo wdzięczny za każdy fragment kodu. Nie mogę znaleźć żadnej metody w przycisku.
Fahad Ali,
Ustawienie id nie pomaga, ponieważ oczekuje rzeczywistego identyfikatora zasobu zamiast tylko liczby, ponieważ setId jest opatrzony adnotacjami @IdRes.
Kevin Tan
to jest nowość, w przeszłości można było wziąć numer zasobu na przykład z układów i używać go jako podstawy dla identyfikatora zasobu, który się nie koliduje. zgaduję, że Google musiał zablokować ten /
codeScriber
6

Aby dodać RelativeLayoutatrybut, którego wartością jest true lub false, użyj 0false lub RelativeLayout.TRUEtrue:

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

Nie ma znaczenia, czy atrybut został już dodany, nadal używasz go, addRule(verb, subject)aby go włączyć / wyłączyć. Można jednak użyć Post-API 17, removeRule(verb)który jest tylko skrótem addRule(verb, 0).

but
źródło
0

Wersja Kotlin:

Używaj tych rozszerzeń z funkcjami infix, które upraszczają późniejsze połączenia

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
}

Następnie użyj ich jako wywołań funkcji infix:

view1 below view2
view1 leftOf view2
view1 alightParentRightIs true

Lub możesz użyć ich jako normalnych funkcji:

view1.below(view2)
view1.leftOf(view2)
view1.alightParentRightIs(true)
Mahmoud
źródło