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?

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

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.

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).


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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.