android - programacion - El botón siempre se muestra en la parte superior en FrameLayout
manual de android en pdf (6)
Tengo FrameLayout así:
<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>
El problema es que el botón se muestra en la parte superior mientras que la descripción general de la clase FrameLayout nos dice esto: "Las vistas secundarias se dibujan en una pila, con el elemento secundario más recientemente agregado en la parte superior".
Como señala la documentación oficial de Android:
FrameLayout está diseñado para bloquear un área en la pantalla para mostrar un solo elemento. Generalmente, FrameLayout se debe usar para mantener una sola vista secundaria, ya que puede ser difícil organizar las vistas secundarias de una manera que se pueda escalar a diferentes tamaños de pantalla sin que los niños se superpongan entre sí. Sin embargo, puede agregar varios hijos a un FrameLayout y controlar su posición dentro del FrameLayout asignando la gravedad a cada niño, usando el atributo android: layout_gravity.
Es mejor si coloca su Button
y Textview
en un RelativeLayout
dentro del FrameLayout
como:
<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>
En Android 5.0 (API 21) y superior, debe agregar Android: elevación en la vista.
<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"/>
Para API <21 no puede usar android: stateListAnimator = "@ null" o cambiar la elevación. En mi caso, utilicé 2 diseños de marcos incrustados en un diseño de restricción. Como los diseños de marcos se pueden apilar unos sobre otros, no es necesario cambiar la elevación de la vista de texto.
<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>
Ponga en su Button
dentro de 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 debe usarse para mantener una single child view
, ya que puede ser difícil organizar las vistas secundarias de una manera que se pueda escalar a diferentes tamaños de pantalla sin que los niños se superpongan entre sí .
Debería usar LinearLayout o RelativeLayout en FrameLayout . De esta manera
<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>
Esta respuesta
Los botones en Lollipop y superiores tienen una elevación predeterminada que hace que siempre se dibujen en la parte superior. Puede cambiar esto anulando el StateListAnimator predeterminado.
Intenta poner esto en tu botón XML:
android:stateListAnimator="@null"
El FrameLayout ahora debería cubrir el botón.