Wie kann das Attribut layout_align_parent_right einer Schaltfläche im relativen Layout programmgesteuert festgelegt werden?

285

Ich habe ein relatives Layout, das ich programmgesteuert erstelle:

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

Jetzt habe ich zwei Schaltflächen, die ich in diesem relativen Layout hinzufügen möchte. Das Problem ist jedoch, dass beide Schaltflächen links neben dem RelatiiveLayout angezeigt werden und sich überlappen.

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

Jetzt möchte ich wissen, wie ich das android:layout_alignParentRight="true"oder" android:layout_toLeftOf="@id/btn"Attribut von Schaltflächen programmgesteuert festlegen kann, wie wir es in der XML tun.

Fahad Ali
quelle

Antworten:

638

Sie können mit LayoutParamsCode auf jeden beliebigen Code zugreifen View.getLayoutParams. Sie müssen sich nur sehr bewusst sein, auf was LayoutParamsSie zugreifen. Dies wird normalerweise erreicht, indem überprüft wird, ViewGroupob der Inhalt ein LayoutParamsinneres Kind hat, das Sie verwenden sollten. In deinem Fall ist es RelativeLayout.LayoutParams. Sie werden RelativeLayout.LayoutParams#addRule(int verb)und verwendenRelativeLayout.LayoutParams#addRule(int verb, int anchor)

Sie können es per Code erreichen:

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
quelle
1
Was ist, wenn der Anker keine ID hat? params.addRule (RelativeLayout.LEFT_OF, R.id.id_to_be_left_of); TextView tvUserName = new TextView (act);
Saint Robson
18
Wie wäre es mit dem Hinzufügen der ID?
user2161301
1
Was ist, wenn buttonauf einem ist RecycleView? Ist es nicht ein Problem, dem gleichen Widget gleiche oder entgegengesetzte Regeln hinzuzufügen?
János
Es funktioniert nur einmal, wenn ich die Ausrichtung ändere, wird es nicht aktualisiert. Darf ich wissen, was das Problem sein kann?
Shshank Bhong
Ich habe versucht, das zu verwenden, aber es wird rot in meinem Code für addRule?
12
  1. Sie müssen eine ID für die Schaltflächen erstellen, die Sie referenzieren müssen: btn1.setId(1);
  2. Sie können die params-Variable verwenden, um Ihrem Layout Parameter hinzuzufügen. Ich denke, die Methode ist addRule(), überprüfen Sie die Android Java-Dokumente für dieses LayoutParamsObjekt.
codeScriber
quelle
Ich würde mich über jeden Code sehr freuen. Ich finde keine Methode in der Schaltfläche.
Fahad Ali
Das Festlegen der ID hilft nicht, da eine echte Ressourcen-ID anstelle einer Zahl erwartet wird, da setId mit @IdRes kommentiert wird.
Kevin Tan
Das ist dann neu. In der Vergangenheit konnten Sie beispielsweise eine Ressourcennummer aus Layouts verwenden und diese als Basis für eine Ressourcen-ID verwenden, die nicht kollidiert. Ich vermute, Google muss diesen /
CodeScriber am
6

Zum Hinzufügen eines RelativeLayoutAttributs, dessen Wert wahr oder falsch ist, verwenden Sie 0für falsch und RelativeLayout.TRUEfür wahr:

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

Es spielt keine Rolle, ob das Attribut bereits hinzugefügt wurde oder nicht, Sie verwenden es dennoch, um es addRule(verb, subject)zu aktivieren / deaktivieren. Sie können jedoch Post-API 17 verwenden, removeRule(verb)was nur eine Verknüpfung für ist addRule(verb, 0).

Schuh
quelle
0

Kotlin-Version:

Verwenden Sie diese Erweiterungen mit Infix-Funktionen , die spätere Aufrufe vereinfachen

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
}

Verwenden Sie sie dann als Infix-Funktionsaufrufe:

view1 below view2
view1 leftOf view2
view1 alightParentRightIs true

Oder Sie können sie als normale Funktionen verwenden:

view1.below(view2)
view1.leftOf(view2)
view1.alightParentRightIs(true)
Mahmoud
quelle