web-dev-qa-db-fra.com

Le bouton s'affiche toujours en haut dans FrameLayout

J'ai FrameLayout comme ceci:

<FrameLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:onClick="changeColor"
        Android:text="new button"/>

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="some text"/>

</FrameLayout>

Le problème est que le bouton est affiché en haut, tandis que la vue d'ensemble de la classe FrameLayout nous indique ceci: "Les vues enfant sont dessinées dans une pile, avec le dernier enfant ajouté en haut".

28
Nokuap

Cette réponse

Les boutons dans Lollipop et les versions supérieures ont une élévation par défaut qui leur fait toujours dessiner sur le dessus. Vous pouvez changer cela en remplaçant le StateListAnimator par défaut.

Essayez de mettre ceci dans votre bouton XML:

Android:stateListAnimator="@null"

FrameLayout devrait maintenant couvrir le bouton.

51
Rahul Tiwari

Dans Android 5.0 (API 21) et les versions ultérieures, vous devez ajouter Android: altitude dans la vue.

<FrameLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:onClick="changeColor"
        Android:text="new button"/>

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="some text"
        Android:elevation="3dp"/>
12
Kyle Vo

Comme le souligne la documantation officielle Android:

FrameLayout est conçu pour bloquer une zone de l'écran pour 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.

Il est préférable de mettre votre Button et Textview dans un RelativeLayout à l'intérieur du FrameLayout comme:

<FrameLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">
    <RelativeLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent">
        <TextView
            Android:id="@+id/textView1"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="some text"/>
        <Button
            Android:id="@+id/button1"
            Android:layout_below="@+id/textView1"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:onClick="changeColor"
            Android:text="new button"/>
        <RelativeLayout>
    </FrameLayout>
2
zkminusck

Apparemment Android: stateListAnimator = "@ null" fonctionne uniquement pour les API = 21 ou supérieur, Donc, pour ceux qui ciblent les API <21, utilisez-le, cela a fonctionné pour moi: D

<FrameLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
    <FrameLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">
        <Button
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:onClick="changeColor"
            Android:text="new button"/>
    </FrameLayout>
    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="some text"/>
</FrameLayout>

1
Hawk Red

Pour les API <21, vous ne pouvez pas utiliser Android: stateListAnimator = "@ null" ou modifier l’altitude. Dans mon cas, j’utilisais deux mises en page incorporées dans une mise en forme de contrainte . Comme les mises en page peuvent être empilées les unes sur les autres, il n’est pas nécessaire de modifier l’altitude de la vue texte.

<Android.support.constraint.ConstraintLayout
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">

<FrameLayout
    Android:layout_width="0dp"
    Android:layout_height="0dp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    >
    <Button
        Android:id="@+id/my_daybutton"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:background="@drawable/cal_button_background"
        Android:textColor="@color/colorPrimaryDark"
        Android:gravity="start|top"
        Android:paddingTop="2dp"
        Android:paddingStart="2dp"
        Android:paddingEnd="2dp"
        />
</FrameLayout>

<FrameLayout
    Android:layout_width="0dp"
    Android:layout_height="0dp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    >
    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="bla"
        Android:textSize="9sp"
        Android:textColor="@Android:color/holo_red_dark"
        Android:layout_gravity="bottom|end"
        />
</FrameLayout>

1
Thoms

Mettez votre Button dans FrameLayout

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <FrameLayout
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content">

        <Button
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="new button" />
    </FrameLayout>

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="some text" />
</RelativeLayout>
1
Anril

FrameLayout doit être utilisé pour contenir un single child view, car il peut s'avérer difficile d'organiser les vues enfant de manière évolutive à différentes tailles d'écran sans que les enfants se chevauchant}

Vous devez utiliser LinearLayout ou RelativeLayout dans FrameLayout . Comme ci-dessous.

<FrameLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

   <RelativeLayout
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent">

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:onClick="changeColor"
        Android:text="new button"/>

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="some text"/>
   </RelativeLayout>

</FrameLayout>
1
IntelliJ Amiya