Efecto de ondulación en los elementos desplegables de Spinner de fondo de color (appcompat-v7 V21)

He intentado aplicar el efecto de rizo en los elementos desplegables de Spinner, así:

Activity.java

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource( this, R.array.array_name, R.layout.simple_spinner_dropdown_item); adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item); Spinner mSpinner = (Spinner) findViewById(R.id.spinner); mSpinner.setAdapter(adapter); 

Simple_spinner_dropdown_item.xml

 <?xml version="1.0" encoding="utf-8"?> <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/spinner_ripple" android:ellipsize="marquee" android:gravity="center_horizontal" android:padding="10dip" android:singleLine="true" android:textSize="14sp" /> 

Spinner_ripple.xml

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item> <ripple android:color="?android:attr/colorControlHighlight"> <item><shape> <solid android:color="@android:color/white" /> </shape> </item> </ripple> </item> </selector> 

Pero en la lista desplegable sólo funciona para el primer elemento y sólo si el elemento seleccionado actual es otro que el primero . En todos los demás casos llena el elemento del fondo con el color de la ondulación (como ninguÌ n efecto de la ondulación). ¿Dónde está mal mi código?

Ya se ha intentado : no funciona para establecer el color fijo en el fondo de la disposición de elementos desplegables y mover el efecto de ondulación en el elemento Spinner, como este:

Simple_spinner_dropdown_item.xml

 <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/white" android:ellipsize="marquee" android:gravity="center_horizontal" android:padding="10dip" android:singleLine="true" android:textSize="14sp" /> 

Activity_layout.xml

 <Spinner android:id="@+id/spinner" android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawSelectorOnTop="true" android:dropDownSelector="@drawable/spinner_ripple" /> 

3 Solutions collect form web for “Efecto de ondulación en los elementos desplegables de Spinner de fondo de color (appcompat-v7 V21)”

Su segundo enfoque es correcto, pero como se menciona en esta pregunta , android:dropDownSelector atributo no funciona y es un error conocido.

Además, si desea cambiar el color de fondo desplegable, debe configurar Spinner's android:popupBackground Spinner's android:popupBackground , en lugar de configurar el fondo del elemento desplegable.

Toda la solución será así:

Popup_background.xml

 <!--Based on Android's popup_background_material.xml--> <!--This changes the background of the drop-down--> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="2dp" /> <solid android:color="@android:color/white" /> </shape> 

Styles.xml

 <resources> <style name="AppTheme" parent="android:Theme.Material.Light"> <!--Workaround for the Android bug--> <item name="android:dropDownListViewStyle">@style/Theme.MyListView</item> </style> <style name="Theme.MyListView" parent="@android:style/Widget.Material.ListView.DropDown"> <item name="android:listSelector">@drawable/spinner_ripple</item> </style> </resources> 

Activity.xml

 ... <Spinner android:id="@+id/spinner" android:layout_width="match_parent" android:layout_height="wrap_content" android:dropDownSelector="@drawable/spinner_ripple" android:popupBackground="@drawable/popup_background" /> ... 

Spinner_ripple.xml (original)

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item> <ripple android:color="?android:attr/colorControlHighlight"> <item> <shape> <solid android:color="@android:color/white" /> </shape> </item> </ripple> </item> </selector> 

Si desea que sus elementos de lista desplegable sean blancos de forma predeterminada y resaltelos con efecto de ondulación sólo cuando el usuario los toca, debe implementar la lista de estado adecuada en el archivo spinner_ripple.xml :

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <ripple android:color="?android:attr/colorControlHighlight" /> </item> <item android:state_pressed="false"> <shape> <solid android:color="@android:color/white" /> </shape> </item> </selector> 

Aquí, android:state_pressed="true" significa que el elemento selector se aplicará sólo cuando el usuario presione la vista. Si desea soportar otros estados selectores, consulte la referencia StateListDrawable .

Tenga en cuenta que AppCompat-v7 v21 no es compatible con el efecto ripple, de acuerdo con el blog oficial de desarrolladores de Android :

¿Por qué no hay ondulaciones en el pre-Lollipop? Una gran parte de lo que permite RippleDrawable a funcionar sin problemas es el nuevo RenderThread de Android 5.0. Para optimizar el rendimiento en versiones anteriores de Android, hemos dejado RippleDrawable por ahora.

Así que sólo funcionará en Lollypop.

Creo que necesitas dos capas en tu spinner_ripple.xml

 <!-- Background --> <ripple android:color="#ff00ff00"> <item android:drawable="@android:color/black" /> <ripple /> <!-- Ripple color --> <ripple android:color="#ff00ff00"> <item android:drawable="@android:color/white" /> <ripple /> 
  • ¿Cómo hacer un efecto de rizo sobre un diseño lineal, sin sobrepasar el color de fondo de sus hijos?
  • RippleDrawable máscara de color, ¿para qué sirve?
  • RippleDrawable - Mostrar efecto de rizado por programación
  • ¿Cómo agregar efecto de rizado a las preferencias en android?
  • ¿Cómo manejar el efecto Ripple en 9-patch y CardView, y tener control sobre los estados del selector?
  • Android: <include> con RippleEffect & StateListAnimator
  • Cambiar el color FAB con efecto de ondulación
  • Cómo crear efecto de rizo en un diseño sencillo
  • No hay efecto de ondulación en el tacto en la vista de reciclaje
  • Agregar los efectos de un RippleDrawable y un StateListDrawable a un RecyclerView
  • AppCompatButton backgroundTint API <21
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.