Android RelativeLayout Définir par programme "centerInParent"

139

J'ai un RelativeLayout comme celui-ci:

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

Je veux pouvoir définir par programme positiveButtonle même effet que:

android:layout_centerInParent="true"

Comment puis-je faire cela par programme?

Alin
la source

Réponses:

401

Complètement non testé, mais cela devrait fonctionner:

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

ajouter à l' android:configChanges="orientation|screenSize"intérieur de votre activité dans votre manifeste

Ruben Scratton
la source
5
Cela a fonctionné, mais seulement après que j'ai inderté layoutParams.addRule (RelativeLayout.ALIGN_PARENT_RIGHT, 0); avant le centre dans la règle parent. Je vous remercie.
Alin
9
Je voudrais ajouter que cela a fonctionné pour moi aussi, mais j'ai dû changer layoutParams.addRule (RelativeLayout.CENTER_IN_PARENT, 0); à layoutParams.addRule (RelativeLayout.CENTER_IN_PARENT, -1); dans ma situation. Votre application peut nécessiter une valeur différente dans le champ "ancre".
Ben Mc
7
la valeur du champ d'ancrage peut être tout sauf 0 pour signifier vrai pour le moment. La source a les comparaisons comme if (rules[CENTER_IN_PARENT] != 0 || rules[CENTER_HORIZONTAL] != 0) {0évalue effectivement àfalse
Dori
2
Comme question de suivi, est-ce que quelqu'un sait si le code de cette réponse peut être utilisé dans des animations? Comme par exemple animer une image d'un décalage gauche relatif à une position centrée, etc.
Jonny
27
vous pouvez simplement utiliser layoutParams.addRule (RelativeLayout.CENTER_IN_PARENT), il n'y a pas besoin du deuxième paramètre, comme vous pouvez vérifier dans la documentation
tarmelop
14

Juste pour ajouter une autre saveur à la réponse de Reuben, je l'utilise comme ceci pour ajouter ou supprimer cette règle selon une condition:

    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
la source
3
La meilleure façon de supprimer une règle serait: layoutParams.removeRule (RelativeLayout. CENTER_IN_PARENT);
Zahid Rasheed
5

J'ai fait pour

1. centerInParent

2. centerHorizontal

3. centerVertical

avec vrai et faux .

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);
}

Comment appeler la méthode:

centerInParent - vrai

addOrRemoveProperty(mView, RelativeLayout.CENTER_IN_PARENT, true);

centerInParent - false

addOrRemoveProperty(mView, RelativeLayout.CENTER_IN_PARENT, false);

centerHorizontal - vrai

addOrRemoveProperty(mView, RelativeLayout.CENTER_HORIZONTAL, true);

centerHorizontal - faux

addOrRemoveProperty(mView, RelativeLayout.CENTER_HORIZONTAL, false);

centerVertical - vrai

addOrRemoveProperty(mView, RelativeLayout.CENTER_VERTICAL, true);

centerVertical - faux

addOrRemoveProperty(mView, RelativeLayout.CENTER_VERTICAL, false);

J'espère que cela vous aidera.

Hiren Patel
la source