Android RelativeLayout programmgesteuert "centerInParent" einstellen

139

Ich habe ein RelativeLayout wie folgt:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dip">

    <Button
        android:id="@+id/negativeButton"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:textSize="20dip"
        android:textColor="#ffffff"
        android:layout_alignParentLeft="true"
        android:background="@drawable/black_menu_button"
        android:layout_marginLeft="5dip"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"/> 

    <Button
        android:id="@+id/positiveButton"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:textSize="20dip"
        android:textColor="#ffffff"
        android:layout_alignParentRight="true"
        android:background="@drawable/blue_menu_button"
        android:layout_marginRight="5dip"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"/>
</RelativeLayout>

Ich möchte in der Lage sein, programmgesteuert positiveButtonden gleichen Effekt zu erzielen wie:

android:layout_centerInParent="true"

Wie kann ich das programmatisch machen?

Alin
quelle

Antworten:

401

Völlig ungetestet, aber das sollte funktionieren:

View positiveButton = findViewById(R.id.positiveButton);
RelativeLayout.LayoutParams layoutParams = 
    (RelativeLayout.LayoutParams)positiveButton.getLayoutParams();
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
positiveButton.setLayoutParams(layoutParams);

Fügen Sie android:configChanges="orientation|screenSize"innerhalb Ihrer Aktivität in Ihrem Manifest hinzu

Reuben Scratton
quelle
5
Das hat funktioniert, aber erst nachdem ich layoutParams.addRule (RelativeLayout.ALIGN_PARENT_RIGHT, 0) eingegeben habe; vor dem Zentrum in der übergeordneten Regel. Danke dir.
Alin
9
Ich möchte hinzufügen, dass dies auch für mich funktioniert hat, aber ich musste layoutParams.addRule (RelativeLayout.CENTER_IN_PARENT, 0) ändern. zu layoutParams.addRule (RelativeLayout.CENTER_IN_PARENT, -1); in meiner Situation. Ihre App benötigt möglicherweise einen anderen Wert im Feld "Anker".
Ben Mc
7
Der Ankerfeldwert kann alles andere als 0 sein , um derzeit true zu kennzeichnen. Quelle hat die Vergleiche wie if (rules[CENTER_IN_PARENT] != 0 || rules[CENTER_HORIZONTAL] != 0) {wo 0effektiv zu bewertenfalse
Dori
2
Weiß jemand als Folgefrage, ob der Code in dieser Antwort in Animationen verwendet werden kann? Wie zum Beispiel ein Bild von einem relativen linken Versatz zu einer zentrierten Position usw. animieren
Jonny
27
Sie können einfach layoutParams.addRule (RelativeLayout.CENTER_IN_PARENT) verwenden, der zweite Parameter ist nicht erforderlich, da Sie in der Dokumentation
nachsehen
14

Um der Reuben-Antwort einen weiteren Geschmack hinzuzufügen, verwende ich sie wie folgt, um diese Regel gemäß einer Bedingung hinzuzufügen oder zu entfernen:

    RelativeLayout.LayoutParams layoutParams =
            (RelativeLayout.LayoutParams) holder.txtGuestName.getLayoutParams();

    if (SOMETHING_THAT_WOULD_LIKE_YOU_TO_CHECK) {
        // if true center text:
        layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
        holder.txtGuestName.setLayoutParams(layoutParams);
    } else {
        // if false remove center:
        layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, 0);
        holder.txtGuestName.setLayoutParams(layoutParams);
    }
Juan Saravia
quelle
3
Der beste Weg, eine Regel zu entfernen, wäre: layoutParams.removeRule (RelativeLayout. CENTER_IN_PARENT);
Zahid Rasheed
5

Ich habe getan für

1. centerInParent

2. centerHorizontal

3. centerVertical

mit wahr und falsch .

private void addOrRemoveProperty(View view, int property, boolean flag){
    RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
    if(flag){
        layoutParams.addRule(property);
    }else {
        layoutParams.removeRule(property);
    }
    view.setLayoutParams(layoutParams);
}

So rufen Sie die Methode auf:

centerInParent - wahr

addOrRemoveProperty(mView, RelativeLayout.CENTER_IN_PARENT, true);

centerInParent - false

addOrRemoveProperty(mView, RelativeLayout.CENTER_IN_PARENT, false);

centerHorizontal - wahr

addOrRemoveProperty(mView, RelativeLayout.CENTER_HORIZONTAL, true);

centerHorizontal - false

addOrRemoveProperty(mView, RelativeLayout.CENTER_HORIZONTAL, false);

centerVertical - wahr

addOrRemoveProperty(mView, RelativeLayout.CENTER_VERTICAL, true);

centerVertical - false

addOrRemoveProperty(mView, RelativeLayout.CENTER_VERTICAL, false);

Hoffe das würde dir helfen.

Hiren Patel
quelle