¿Cómo agregar efecto de rizado a las preferencias en android?

Estoy trabajando en la adición del efecto de la ondulación cuando la preferencia se toca (seleccionado). He personalizado mi preferencia extendiendo ListPreference . He intentado fijar el efecto de la ondulación programmatically usando RippleDrawable pero no veo la animación.

Aquí está mi clase de preferencia personalizada

 public class CustomListPreference extends ListPreference { public CustomListPreference(Context context, AttributeSet attrs) { super(context, attrs); } public CustomListPreference(Context context) { super(context); } @Override protected void onBindView(View view) { super.onBindView(view); setCustomStyle(view); } private void setCustomStyle(View view) { TextView titleView = (TextView) view.findViewById(android.R.id.title); titleView.setTypeface(InitActivity.TYPEFACE_REGULAR); TextView summary = (TextView) view.findViewById(android.R.id.summary); summary.setTypeface(InitActivity.TYPEFACE_REGULAR); //Setting the drawable here, but it doesn't work. RippleDrawable drawable = (RippleDrawable) getContext().getResources().getDrawable(R.drawable.my_ripple_background); view.setBackGround(drawable); } } 

Mi configuración de preferencias

 <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <!-- opens a subscreen of settings --> <com.abc.app.CustomListPreference android:defaultValue="1" android:entries="@array/sampleEntries" android:entryValues="@array/SampleEntryValues" android:key="some_preference" android:title="@string/some_preferences" /> <com.abc.app.CustomCheckboxPreference android... /> </PreferenceScreen> 

Mi ondulación xml

 <ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="@color/light_black_overlay"> <!--#22000000--> <item> <shape android:shape="rectangle"> <solid android:color="@android:color/background_light" /> </shape> </item> </ripple> 

¿Estoy configurando la animación para la vista correcta? Cualquier idea es apreciada. Gracias.

Este es un ejemplo completo mínimo para agregar un efecto de rizado personalizado a una clase que extiende ListPreference . Acabo de hacer y probar esto con API 21 (5.0).

SettingsActivity (Actividad de lanzamiento)

 public class SettingsActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_general); } } 

Pref_general.xml

 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <CheckBoxPreference android:defaultValue="true" android:key="example_checkbox" android:summary="a checkbox" android:title="Checkbox test" /> <!-- replace with com.abc.app.CustomListPreference in your case--> <com.timcastelijns.rippletest.CustomListPreference android:defaultValue="1" android:entries="@array/sampleEntries" android:entryValues="@array/SampleEntryValues" android:key="some_preference" android:title="test" /> </PreferenceScreen> 

Arrays.xml

 <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="sampleEntries"> <item>1</item> <item>2</item> <item>3</item> </string-array> <string-array name="SampleEntryValues"> <item>4</item> <item>5</item> <item>6</item> </string-array> </resources> 

CustomListPreference

 public class CustomListPreference extends ListPreference { private Context ctx; public CustomListPreference(Context context, AttributeSet attrs) { super(context, attrs); ctx = context; } public CustomListPreference(Context context) { super(context); ctx = context; } @Override protected void onBindView(View view) { super.onBindView(view); setCustomStyle(view); } private void setCustomStyle(View view) { RippleDrawable drawable = (RippleDrawable) ctx.getDrawable(R.drawable.my_ripple_background); view.setBackground(drawable); } } 

My_ripple_background.xml

 <?xml version="1.0" encoding="utf-8"?> <ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="@android:color/holo_blue_light"> <item android:id="@android:id/mask"> <color android:color="@android:color/white" /> </item> </ripple> 

Cuando se presiona, muestra un efecto de ondulación azul claro, como se especifica en el xml:

Introduzca aquí la descripción de la imagen


He construido este ejemplo basado en su código, y el código del ejemplo SettingsActivity en las muestras de SDK android.


Editar:
Después de algún tiempo en el chat y probar varias cosas, hemos llegado a la conclusión de que el problema es causado por el teléfono de OP (Samsung S5) o su configuración. Cuando OP probó el código en el emulador, todo funcionó correctamente.

Para la referencia – esto es cómo miró en el teléfono de OPs:

Introduzca aquí la descripción de la imagen

  • SetBackgroundResource actúa diferente de setBackground con RippleDrawable
  • RippleDrawable máscara de color, ¿para qué sirve?
  • Cómo establecer state_selected en ripple drawable
  • El efecto Ripple no va por encima de ImageView
  • Ondulación y fondo sin límites de Android
  • Cambiar el color FAB con efecto de ondulación
  • El efecto Ripple no aparece a veces
  • No se pudo encontrar la clase 'android.graphics.drawable.RippleDrawable' Unicode issue?
  • Color de fondo ondulado de Android
  • El efecto Ripple no funciona en RelativeLayout
  • Efecto de ondulación de material oculto por otra vista en el diseño
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.