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.
- Cómo alinear el botón de acción flotante al centro
- No puedo desplazar mi diseño en multi-ventana en Nougat 7.0
- ¿Por qué Android Studio siempre muestra ActionBar en el diseño de la aplicación, incluso cuando está deshabilitado?
- Android añadiendo pie de página a ListView addFooterView ()?
- Cómo llamar a los colores de los recursos de forma dinámica en Android?
¡¡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:
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:
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) …
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
Switch_thumb_normal_orange.9.png
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
Switch_track_normal_orange.9.png
Resultados:
Y el resultado es simplemente horrible! :
¿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?
- ¿Cómo hacer el borde inferior en formato XML seleccionable selector?
- Error al agregar tema personalizado a la aplicación
- Solo se muestra un elemento en la vista de reciclado
- Pasar recurso XML a XMLReader
- Error android.permission.WRITE_SECURE_SETTINGS
- Cómo crear un menú mediante programación en Android?
- Android: Necesito una vista previa circular de la cámara. ¿Cómo lograrlo?
- Android: Valor de cadena con nueva línea en XML
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:
- Política de privacidad de la aplicación para Android
- Android cómo abrir un archivo de extensión .doc?