studio programacion herramientas fundamentos con avanzado aplicaciones android framelayout

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.