android xml android-5.0-lollipop android-support-library android-cardview

android - CardView se coloca sobre FrameLayout, pero se declara primero



xml android-5.0-lollipop (4)

Tengo FrameLayout simple con compatibilidad con CardView como primer elemento, y TextView como segundo, por lo que TextView debe estar en la parte superior de la vista inflada. Esto funciona en pre-Lolipop pero en la tarjeta 21+ ocupa el primer lugar en el diseño, ¿por qué es así y cómo solucionarlo? Lo mismo con RelativeLayout. Diseño:

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="200dp" android:layout_margin="20dp" app:cardBackgroundColor="#ff0000" app:cardUseCompatPadding="false" /> <TextView android:layout_width="match_parent" android:layout_height="100dp" android:text="i am top view!" android:gravity="center" android:layout_gravity="center" android:textSize="30sp" android:textAllCaps="true" android:textColor="#00ff00" android:background="#0000ff" /> </FrameLayout>


Esto funcionó para mí!

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content"> <!-- Add this layout as parent of CardView --> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="200dp" android:layout_margin="20dp" app:cardBackgroundColor="#ff0000" app:cardUseCompatPadding="false" /> </LinearLayout> <!--Close parent layout--> <TextView android:layout_width="match_parent" android:layout_height="100dp" android:layout_gravity="center" android:background="#0000ff" android:gravity="center" android:text="i am top view!" android:textAllCaps="true" android:textColor="#00ff00" android:textSize="30sp" /> </FrameLayout>


En caso de que alguien llegue aquí y la solución para establecer la elevación no funcione para ellos (como en mi caso, donde necesitaba dibujar una imagen por encima de CardView y tener una sombra no era aceptable), puede resolver el problema al envolviendo el CardView dentro de otro FrameLayout . En el ejemplo proporcionado, se vería algo como esto:

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content"> <!-- This is the added FrameLayout --> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="200dp" android:layout_margin="20dp" app:cardBackgroundColor="#ff0000" app:cardUseCompatPadding="false" /> </FrameLayout> <TextView android:layout_width="match_parent" android:layout_height="100dp" android:text="i am top view!" android:gravity="center" android:layout_gravity="center" android:textSize="30sp" android:textAllCaps="true" android:textColor="#00ff00" android:background="#0000ff" /> </FrameLayout>


Puede que me una a la discusión un poco tarde, pero si puede darse el lujo de renunciar a la elevación de CardView , puede configurar la propiedad cardElevation de CardView en su diseño XML en 0dp .

Al igual que:

app:cardElevation="0dp"


Solo agregue su vista de texto dentro de la vista de tarjeta, hasta donde sé que el orden z no está definido dentro de un diseño de marco, pero la última vista de diseño debe dibujarse en último lugar.

Esto probablemente tuvo que ver con las vistas de cartas en la elevación de uso de piruletas mientras que recurren al código de dibujo de bordes antes de la piruleta.