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".
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.
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"/>
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>
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>
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>
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>
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>