Definir un estilo personalizado (tema) en un componente de conmutador Android

Soy nuevo en el desarrollo de Android y también en el tema de Android / personalización que parece ser un tema amplio …

Estoy tratando de dar a mi componente Switch un aspecto especial, pero no logro lograr lo que quiero, avan después de buscar muchos recursos en Internet.

¡¡Esto me está volviendo loca!!
Gracias de antemano por su ayuda, maestros de Android!

El contexto

Trabajo en una aplicación androide existente (v1) que era minSdkVersion = "8".

Debido a esto, la aplicación utiliza bibliotecas de terceros para obtener barra de acción ( ActionBar Sherlock ) y los interruptores ( SwitchCompatLibrary ):

Hoy, estamos haciendo la versión v2, con minSdkVersion = "14".

Nuestro cliente también nos pide que cambiemos el aspecto y la sensación del interruptor por defecto.

El objetivo es tener estos conmutadores:
Introduzca aquí la descripción de la imagen Introduzca aquí la descripción de la imagen

Esto se parece realmente a los interruptores más últimos del diseño material, pero con el color anaranjado en vez del color "verde-azul", como aquí .

Las limitaciones

Como ahora somos minSdk 14, podríamos eliminar las 2 librerías "ActionBarSherlock" y "SwitchCompatLibrary", pero esto NO es una opción. De hecho, no tenemos tiempo para eso …

De hecho, traté de agregar dependencias en el archivo gradle de mi proyecto appcompat-v7 , para intentar usar el componente switch nativo con el tema material dentro ( ver aquí ) pero esto me da errores debido a definiciones de atributos duplicados con las 2 bibliotecas mencionadas encima. Así que no puedo usarlo, y no estoy seguro de que esto debería tener trabajo …

dependencies { (...) compile project(':actionbarsherlock') compile project(':switchCompatLibrary') compile files('libs/android-support-v4.jar') // incompatible avec actionbarsherlock and SwitchCompatLibrary... // compile "com.android.support:appcompat-v7:22.0.+" (...) } 

Código existente

Así que aquí está el código actual.

En mi archivo layout.xml, uso el conmutador SwitchCompatLibrary:

  <de.ankri.views.Switch android:id="@+id/switchButtonNotification" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" /> 

En mi archivo themes.xml:

 <style name="Theme.Orange" parent="@style/Theme.Sherlock"> ... <!-- Theme switch with SwitchCompatLibrary --> <item name="switchStyle">@style/switch_light</item> <item name="textAppearance">@style/TextAppearance</item> </style> 

Con información de estilo definida en la propia SwitchCompatLibrary como esta

Styles.xml:

 <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="switch_light"> <item name="track">@drawable/switch_track_holo_light</item> <item name="thumb">@drawable/switch_inner_holo_light</item> <item name="textOn">@string/textOn</item> <item name="textOff">@string/textOff</item> <item name="thumbTextPadding">12dip</item> <item name="switchMinWidth">96dip</item> <item name="switchPadding">16dip</item> <item name="switchTextAppearance">@style/TextAppearance</item> </style> <style name="TextAppearance"> <item name="textColor">?android:attr/textColorPrimary</item> <item name="textColorHighlight">?android:attr/textColorHighlight</item> <item name="textColorHint">?android:attr/textColorHint</item> <item name="textColorLink">?android:attr/textColorLink</item> <item name="textSize">16sp</item> </style> </resources> 

Switch_inner_holo_light.xml

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="false" android:drawable="@drawable/switch_thumb_disabled_holo_light" /> <item android:state_pressed="true" android:drawable="@drawable/switch_thumb_pressed_holo_light" /> <item android:state_checked="true" android:drawable="@drawable/switch_thumb_activated_holo_light" /> <item android:drawable="@drawable/switch_thumb_holo_light" /> </selector> 

Switch_track_holo_light.xml

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_focused="true" android:drawable="@drawable/switch_bg_focused_holo_light" /> <item android:drawable="@drawable/switch_bg_holo_light" /> </selector> 

Y el resultado es el siguiente:
Introduzca aquí la descripción de la imagen Introduzca aquí la descripción de la imagen

Lo que intenté

Utilice el conmutador nativo

Como soy ahora API 14 mínimo, primero traté de reemplazar el "de.ankri.views.Switch" con "android.widget.Switch" en mi layout.xml, pero el estilo ya no estaba aplicando (interruptor azul activado en su lugar O naranja) …
Introduzca aquí la descripción de la imagen Introduzca aquí la descripción de la imagen

Sin embargo, definiendo directamente en cada switch el tema ( como se describe aquí ) parece funcionar mejor, ya que tengo un naranja de vuelta:

  <Switch android:id="@+id/switchButtonNotification" android:layout_width="wrap_content" android:layout_height="wrap_content" tools:checked="true" android:thumb="@drawable/switch_inner_holo_light" android:track="@drawable/switch_track_holo_light" android:layout_alignParentRight="true" /> 

Extraño … No sé por qué, así que no voy a hacer eso y mantener "de.ankri.views.Switch" componente.

Utilice el conmutador SwitchCompatLibrary y haga mi propio estilo

Entonces traté de mantener el componente "de.ankri.views.Switch" y hacer lo mismo que SwitchCompatLibrary, pero reemplazando el estilo "@ style / switch_light" con mi propio, usando nuevos drawables para track y thumb

Themes.xml:

 <style name="Theme.Orange" parent="@style/Theme.Sherlock"> ... <!-- Theme switch with SwitchCompatLibrary --> <item name="switchStyle">@style/Switch.Orange</item> <item name="textAppearance">@style/TextAppearance</item> </style> 

Styles.xml:

 <style name="Switch.Orange" parent="@style/switch_light"> <item name="track">@drawable/switch_track_orange</item> <item name="thumb">@drawable/switch_thumb_orange</item> <item name="textOn">@string/textOn</item> <item name="textOff">@string/textOff</item> <item name="thumbTextPadding">12dip</item> <item name="switchMinWidth">96dip</item> <item name="switchPadding">16dip</item> <item name="switchTextAppearance">@style/TextAppearance</item> </style> 

Switch_thumb_orange.xml

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="false" android:drawable="@drawable/switch_thumb_normal_orange" /> <item android:state_pressed="true" android:drawable="@drawable/switch_thumb_activated_orange" /> <item android:state_checked="true" android:drawable="@drawable/switch_thumb_activated_orange" /> <item android:drawable="@drawable/switch_thumb_normal_orange" /> </selector> 

Switch_thumb_activated_orange.9.png Introduzca aquí la descripción de la imagen

Switch_thumb_normal_orange.9.png Introduzca aquí la descripción de la imagen

Switch_track_orange.xml

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="false" android:drawable="@drawable/switch_track_normal_orange" /> <item android:state_checked="true" android:drawable="@drawable/switch_track_activated_orange" /> <item android:state_focused="true" android:drawable="@drawable/switch_track_activated_orange" /> <item android:drawable="@drawable/switch_track_normal_orange" /> </selector> 

Switch_track_activated_orange.9.png Introduzca aquí la descripción de la imagen

Switch_track_normal_orange.9.png Introduzca aquí la descripción de la imagen

Resultados:

Y el resultado es simplemente horrible! :
Introduzca aquí la descripción de la imagen Introduzca aquí la descripción de la imagen

¿Dónde estoy equivocado? Traté de cambiar el "thumbTextPadding", "switchMinWidth" y "switchPadding" en styles.xml, pero sin buenos resultados.

Tal vez mis archivos de 9 parches están mal?

Esta publicación describe lo que necesita: http://www.materialdoc.com/switch/

Si el color no funciona (api <21), eche un vistazo a este post stackoverflow.

¡Espero que esto te ayude!

Como primer paso, le sugiero que reemplace actionBarSherlock con support.v7.app.ActionBar. ( https://developer.android.com/reference/android/support/v7/app/ActionBar.html )

Esta migración necesita algún tiempo porque debe redefinir su estilo existente. En mi memoria, cuando he hecho una migración similar, el código de estilo v7 se parece al estilo de actionBarSherlock. En este momento, v7 ActionBar se llamó ActionBarCompat.

Puede probar esto:

  • Haga una imagen para el fondo de su interruptor.
  • Que debe tener una altura igual a la de su círculo.
  • Y la parte superior e inferior de la imagen debe tener el siguiente aspecto:

Http://screenshot.sh/owpTUNk8jTtUl

  • Quitar la sombra de ActionBar en Android L (API 21)
  • Cómo analizar el valor en el atributo en el análisis xml
  • Organizar Strings.xml
  • app falla cuando cambio el orden de mi XML RelativeLayout android
  • Establecer márgenes para los botones utilizando drawable en android
  • Los caracteres especiales no se muestran en android
  • Reutilizar código TextView en XML de Android
  • Cómo hacer una pantalla completa DrawerLayout en Android?
  • Actividad de configuración botón Arriba
  • Uso de atributos desde el nivel API más allá de minSdkVersion
  • Android: cambiar el tamaño de la vista de la imagen en XML
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.