web-dev-qa-db-fra.com

Comment aligner un élément à droite dans FrameLayout?

J'ai un FrameLayout qui contient 2 vues, la seconde est quelque chose comme un Close Button (X) et je veux le positionner à droite.

J'ai essayé layout_gravity = "right", mais cela n'a pas fonctionné.

Ceci est ma mise en page XML:

<FrameLayout Android:layout_width="320dp"
    Android:layout_height="wrap_content"
    Android:id="@+id/layoutSmallImg">

    <ImageView Android:id="@+id/bigImage"
        Android:layout_width="320dp" Android:layout_height="wrap_content"/>

    <ImageView Android:id="@+id/bigImage"
        Android:layout_width="320dp" Android:layout_height="wrap_content"/>

    <ImageButton Android:id="@+id/closebutton"
        Android:background="@Android:color/transparent"
        Android:layout_height="30dp" Android:layout_marginTop="10dp"
        Android:layout_alignParentRight="true"
        Android:layout_width="30dp" Android:paddingLeft="40dp"
        Android:visibility="gone" 
        Android:src="@drawable/close" />
</FrameLayout>
19
Houcine

Je vous recommande d'utiliser une RelativeLayout à la place

FrameLayout est conçu pour bloquer une zone de l'écran afin d'afficher un seul élément. Vous pouvez ajouter plusieurs enfants à un FrameLayout et contrôler leur position dans FrameLayout à l'aide de la gravité. Les enfants sont dessinés dans une pile, avec le dernier enfant ajouté en haut. La taille de la structure de cadre est la taille de son plus grand enfant (plus le rembourrage) visible ou non (si le parent de FrameLayout le permet). Les vues qui sont GONE ne sont utilisées pour le dimensionnement que si setConsiderGoneChildrenWhenMeasuring () est défini sur true.

BTW, voulez-vous le bouton sur ImageView ou à côté de celui-ci? Vous définissez la largeur de la mise en page et de l'imageView à la même taille.


Après le commentaire, je peux voir deux options:

31
Aleadam

Lire le DOCS:

FrameLayout est conçu pour bloquer une zone de l'écran à afficher un seul article. Généralement, FrameLayout doit être utilisé pour contenir un seul vue enfant, car il peut être difficile d’organiser des vues enfants dans un fichier façon qui est évolutive à différentes tailles d'écran sans les enfants qui se chevauchent. Vous pouvez cependant ajouter plusieurs enfants à un FrameLayout et contrôle leur position dans FrameLayout de attribuer la gravité à chaque enfant, en utilisant Android: layout_gravity attribut.

Essayer:

<TextView
     .....
     Android:layout_gravity="right" />

Vous pouvez placer une vue à 9 endroits différents dans un FrameLayout

Prendre plaisir

19
Yotam

Placez simplement vos éléments dans FrameLayout dans le second RelativeLayout. Et utilisez Android: layout_alignParentRight = "true" pour l'élément que vous souhaitez aligner à droite.

<FrameLayout Android:layout_width="320dp" Android:layout_height="wrap_content" 
                                      Android:id="@+id/layoutSmallImg">
 <RelativeLayout
            Android:id="@+id/content"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent" >
    <ImageView Android:id="@+id/bigImage"
            Android:layout_width="320dp" 
            Android:layout_height="wrap_content"/>

    <ImageButton Android:id="@+id/closebutton"
            Android:background="@Android:color/transparent"
            Android:layout_height="30dp" Android:layout_marginTop="10dp"
            Android:layout_alignParentRight="true"
            Android:layout_width="30dp" Android:paddingLeft="40dp"
            Android:visibility="gone" 
            Android:src="@drawable/close" />
  </RelativeLayout>
</FrameLayout>
9
zest

Utilisez un RelativeLayout à la place.

2

Par programme, vous pouvez définir la marge à l’aide de FrameLayout.LayoutParams. Ce qui suit fonctionnerait pour placer une vue au bas de votre écran:

int desired_height_of_content = //whatever your want the height of your view to be
FrameLayout layout = new FrameLayout(this);
FrameLayout.LayoutParams flp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, desired_height_of_content);
int difference = screen_height - desired_height_of_content
flp.setMargins(difference, 0, 0, 0);
layout.addView(your_view, flp);
1
Casey Murray

Voulez-vous utiliser FrameLayout ou RelativeLayout?

D'après ce que j'ai compris, FrameLayout est utilisé si vous souhaitez remplacer votre vue actuelle par une autre. Votre exigence peut être remplie par RelativeLayout.

0
varuaa