149 votes

Android RelativeLayout de manière programmatique Définir "centerInParent" (centrer dans le parent)

J'ai un RelativeLayout comme ça :

<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 programmer la mise en place pour positiveButton le même effet que :

android:layout_centerInParent="true"

Comment puis-je faire cela par programme ?

426voto

Reuben Scratton Points 22314

Complètement non testé, mais ceci devrait travail :

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 android:configChanges="orientation|screenSize" dans votre activité dans votre manifeste

5 votes

Cela a fonctionné, mais seulement après que j'ai indertet layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0) ; avant de centrer dans la règle parentale. Merci.

9 votes

J'aimerais ajouter que cela a également fonctionné pour moi, mais j'ai dû changer layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, 0) ; en layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, -1) ; dans ma situation. Votre application peut exiger une valeur différente dans le champ "anchor".

7 votes

La valeur du champ d'ancrage peut être tout sauf 0 pour signifier vrai à l'heure actuelle. La source a les comparaisons comme if (rules[CENTER_IN_PARENT] != 0 || rules[CENTER_HORIZONTAL] != 0) {0 évalue efficacement pour false

14voto

juancho Points 52

Pour ajouter une autre saveur à la réponse Reuben, je l'utilise comme ceci pour ajouter ou supprimer cette règle en fonction d'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);
    }

9voto

Hiren Patel Points 15583

J'ai fait pour

1. centrerEnParent

2. centreHorizontal

3. centreVertical

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

addOrRemoveProperty(mView, RelativeLayout.CENTER_IN_PARENT, true);

centerInParent - false

addOrRemoveProperty(mView, RelativeLayout.CENTER_IN_PARENT, false);

centerHorizontal - true

addOrRemoveProperty(mView, RelativeLayout.CENTER_HORIZONTAL, true);

centerHorizontal - false

addOrRemoveProperty(mView, RelativeLayout.CENTER_HORIZONTAL, false);

centerVertical - true

addOrRemoveProperty(mView, RelativeLayout.CENTER_VERTICAL, true);

centerVertical - false

addOrRemoveProperty(mView, RelativeLayout.CENTER_VERTICAL, false);

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X