Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Anular Android-L CardView state_pressed para versiones anteriores de Android

En el último SDK para Android tenemos ahora el nuevo CardView, he reemplazado mi antiguo CustomCardView por la nueva versión, pero al ejecutarlo con versiones anteriores de Android veo que los state_pressed y state_focused son cuadrados feos que aparecen encima de CardView. ..

¿Alguien sabe cómo puedo emular lo siguiente en el nuevo CardView, pero sólo cuando se utilizan versiones anteriores de Android?

 <selector xmlns:android="http://schemas.android.com/apk/res/android" android:enterFadeDuration="150" android:exitFadeDuration="150" > <item android:state_pressed="true" android:drawable="@drawable/card_on_press"/> <item android:state_focused="true" android:state_enabled="true" android:drawable="@drawable/card_on_focus"/> <item android:state_enabled="true" android:drawable="@drawable/card_default"/> <item android:state_enabled="false" android:drawable="@drawable/card_on_press"/> </selector> 

Y para aquellos de ustedes interesados ​​aquí es el CardView que estoy usando ahora:

 <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/CardView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginTop="10dp" android:foreground="?android:attr/selectableItemBackground" android:onClick="RunSomeMethod" card_view:cardCornerRadius="4dp" android:focusable="true" android:elevation="2dp"> <LinearLayout android:id="@+id/LinearLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:focusable="false" android:visibility="visible"> </LinearLayout> </android.support.v7.widget.CardView> 

3 Solutions collect form web for “Anular Android-L CardView state_pressed para versiones anteriores de Android”

Se ha corregido con el siguiente código:

Values-v21 \ styles.xml:

 <style name="CardViewStyle" parent="CardView.Light"> <item name="android:foreground">?android:attr/selectableItemBackground</item> </style> 

Values ​​\ styles.xml:

 <style name="CardViewStyle" parent="android:Widget.TextView"> <item name="android:foreground">@drawable/card</item> </style> 

Una carta del layout \ main_layout.xml:

 <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/Card_View" style="@style/CardViewStyle" android:layout_width="480dp" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginTop="10dp" card_view:cardCornerRadius="4dp" android:elevation="2dp"> 

Esto le permitirá ofrecer las animaciones en v21 + pero también ofrecer animaciones alternativas en pre-v21 en lugar de la gran cuadrado azul / gris.

Aquí está el card.xml que estoy usando como un drawable para ésos de usted interesó:

 <selector xmlns:android="http://schemas.android.com/apk/res/android" android:enterFadeDuration="150" android:exitFadeDuration="150" > <item android:state_pressed="true" android:drawable="@drawable/card_on_press"/> <item android:state_focused="true" android:state_enabled="true" android:drawable="@drawable/card_on_focus"/> <item android:state_enabled="true" android:drawable="@drawable/card_default"/> <item android:state_enabled="false" android:drawable="@drawable/card_on_press"/> </selector> 

Nota : El predeterminado por dibujo estará bien como un elemento transparente, ya que CardView proporciona un fondo predeterminado para todas las versiones de android.

Tal vez la biblioteca se ha actualizado, pero cuando uso lo siguiente se ve bien en versiones anteriores de Android.

Puede utilizar el 'CardView.Dark' y CardView.Light ' (se generará automáticamente con la biblioteca de soporte de tarjetas)

En sus valores / estilos.xml

 <style name="CardViewStyle.Light" parent="CardView.Light"> <item name="android:foreground">?android:attr/selectableItemBackground</item> </style> <style name="CardViewStyle.Dark" parent="CardView.Dark"> <item name="android:foreground">?android:attr/selectableItemBackground</item> </style> 

Disposiciones para CardView

Crear dos diseños, uno para la oscuridad y otro para la luz. Incluirán las vistas de tarjeta como esta:

 <android.support.v7.widget.CardView android:id="@+id/my_card_view" style="@style/CardViewStyle.Light" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:orientation="vertical" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginBottom="8dp" app:cardCornerRadius="2dp" android:elevation="2dp"> ... other layout stuff ... </android.support.v7.widget.CardView> 

 <android.support.v7.widget.CardView android:id="@+id/my_card_view" style="@style/CardViewStyle.Dark" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:orientation="vertical" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginBottom="8dp" app:cardCornerRadius="2dp" android:elevation="2dp"> ... other layout stuff ... </android.support.v7.widget.CardView> 

Tome nota de cambiar el estilo en cada CardView.

Otras personalizaciones

Si desea personalizar el color en lugar de sólo tener negro o blanco, puede utilizar lo siguiente:

Para obtener el CardView dibujable puede utilizar:

 View cardView = findViewById(R.id.my_card_view); Drawable cardViewDrawable cardView.getBackground(); convertIcon(setViewBackground(cardView, cardViewDrawable)); 

Mi 'convertIcon' es simplemente el siguiente:

 /** * * @param drawable eg "getResources().getDrawable(R.drawable.my_drawable)" * @param tint eg "Color.parseColor(lightTitlebarFg)" * @return Drawable * */ public static Drawable convertIcon(Drawable drawable, int tint) { ColorFilter filter = new PorterDuffColorFilter(tint, PorterDuff.Mode.SRC_ATOP); drawable.setColorFilter(filter); return drawable; } 

Mi 'setViewBackground' es simplemente el siguiente:

 @TargetApi(Build.VERSION_CODES.JELLY_BEAN) @SuppressWarnings("deprecation") public static void setViewBackground(View view, Drawable drawable){ if (UIUtils.isJB()) { view.setBackground(drawable); } else { view.setBackgroundDrawable(drawable); } } 

StateListDrawable

Si desea crear un StateListDrawable mediante programación puede utilizar lo siguiente:

 StateListDrawable states = new StateListDrawable(); states.addState(new int[] { android.R.attr.state_focused }, focusedDrawable); states.addState(new int[] { android.R.attr.state_activated }, activatedDrawable); states.addState(new int[] { android.R.attr.state_enabled }, defaultDrawable); states.addState(new int[] {}, defaultDrawable); 

Aquí está el código que usé en el archivo card_on_press.xml que se guarda en la carpeta del proyecto:

 <item> <shape> <padding android:bottom="0dp" android:left="0dp" android:right="0dp" android:top="0dp" /> <solid android:color="@color/transparent" /> </shape> </item> <item> <shape> <padding android:bottom="0dp" android:left="0dp" android:right="0dp" android:top="0dp" /> <solid android:color="@color/card_shadow_1_on_press" /> <corners android:radius="8dp" /> </shape> </item> <item> <shape> <padding android:bottom="0dp" android:left="0dp" android:right="0dp" android:top="0dp" /> <solid android:color="@color/card_shadow_2_on_press" /> <corners android:radius="8dp" /> </shape> </item> <!-- Background --> <item> <shape> <solid android:color="@color/card_background_on_press" /> <corners android:radius="8dp" /> </shape> </item> 

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.