Cómo dar al usuario la posibilidad de cambiar entre diferentes colores skin en tu aplicación

Quiero darle al usuario la oportunidad de seleccionar qué color de piel tendrá la aplicación. Por ejemplo, implementaría una piel negra con colores negros con diferentes tonalidades y también una piel blanca con tonalidades.

¿Cuál sería el mejor enfoque para lograr esto?

Por ejemplo, sé que hay un archivo colors.xml en Android que debe contener los colores de la aplicación. ¿Sería una manera de tener archivos de dos colores o algo así y usar uno u otro dependiendo de la selección del usuario? Tal vez un archivo styles.xml?

Por favor, dígame su opinión sobre cuál sería el mejor enfoque para lograr esto

Gracias

MI DISEÑO:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- The main content view --> <RelativeLayout android:id="@+id/main_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.view.PagerTitleStrip android:id="@+id/pager_title_strip" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="top" android:paddingTop="4dp" android:paddingBottom="4dp" style="@style/CustomPagerTitleStrip"/> </android.support.v4.view.ViewPager> </RelativeLayout> <!-- The navigation drawer --> <android.support.design.widget.NavigationView android:id="@+id/navigation_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:headerLayout="@layout/drawer_header" app:menu="@menu/drawer_menu" style="@style/NavigationDrawerStyle"/> </android.support.v4.widget.DrawerLayout> 

Mi archivo styles.xml:

 <resources> <style name="AppTheme" parent="Theme.AppCompat"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="actionBarTheme">@style/CustomActionBar</item> <item name="android:textColor">@color/colorFontMenus</item> <item name="itemTextColor">@color/colorFontMenus</item> <item name="itemIconTint">@color/colorFontMenus</item> </style> <style name="CustomActionBar"> <!-- title text color --> <item name="android:textColorPrimary">@color/colorFontMenus</item> <!-- subtitle text color --> <item name="android:textColorSecondary">?android:textColorPrimary</item> <!-- action menu item text color --> <item name="actionMenuTextColor">?android:textColorPrimary</item> <!-- action menu item icon color - only applies to appcompat-v7 icons :( --> <item name="colorControlNormal">?android:textColorPrimary</item> </style> <style name="CustomPagerTitleStrip"> <item name="android:background">@color/mainColorWithAlpha</item> </style> <style name="CustomTextView"> <item name="android:textColor">@color/colorFontContent</item> </style> <style name="CustomScrollBar"> <item name="android:scrollbarThumbVertical">@drawable/scrollbar_green</item> </style> <style name="CustomDrawerHeader"> <item name="android:background">@drawable/drawer_header_background_green</item> </style> <style name="NavigationDrawerStyle"> <item name="android:background">@color/colorPrimaryDark</item> </style> </resources> 

2 Solutions collect form web for “Cómo dar al usuario la posibilidad de cambiar entre diferentes colores skin en tu aplicación”

Respecto a la respuesta de @Joaquim Ley podemos cambiar el tema antes de super.onCreate() .

En mi aplicación (en el trabajo) my styles.xml :

Este es mi tema predeterminado

 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="android:colorAccent">@color/colorPrimary</item> <item name="android:statusBarColor">@color/colorPrimaryDark</item> <item name="android:colorFocusedHighlight">@color/colorPrimary</item> <item name="android:colorControlNormal">@color/amber_300</item> <item name="android:colorControlActivated">@color/amber_300</item> <item name="android:colorControlHighlight">@color/colorControlHighlight</item> <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> <item name="android:windowTranslucentStatus">false</item> <item name="actionBarItemBackground">?attr/selectableItemBackground</item> <item name="colorControlHighlight">@color/colorControlHighlight</item> <item name="android:windowContentTransitions">true</item> <!-- Customize your theme here. --> </style> 

Y este es mi tema verde:

 <style name="AppTheme.Green" parent="AppTheme"> <item name="colorPrimary">@color/green_500</item> <item name="colorPrimaryDark">@color/green_700</item> <item name="android:colorAccent">@color/green_300</item> <item name="android:statusBarColor">@color/green_700</item> <item name="android:colorFocusedHighlight">@color/green_500</item> <item name="android:colorControlNormal">@color/green_300</item> <item name="android:colorControlActivated">@color/green_300</item> </style> 

Al cambiar el tema:

 @Override protected void onCreate(Bundle savedInstanceState) { mPrefs=getSharedPreferences(getResources().getString(R.string.preference_name),MODE_PRIVATE); mEditor=mPrefs.edit(); mEditor.apply(); defaultColor=mPrefs.getInt(getResources().getString(R.string.default_color),0); //you can do some switch case or if else of defaultColor and change theme setTheme(R.style.AppTheme_Green); super.onCreate(savedInstanceState); setContentView(R.layout.activity_add_voice_record); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); } 

Esta es mi primera aplicación en el trabajo, pero en mi aplicación personal he creado una BaseActivity y creado un método handleColor(int color,int darkcolor) . Pero esto no cambiará todo el tema de la Toolbar , StatusBar , NavigationBar y EditText marcador y subrayar los colores:

 public class BaseActivity extends AppCompatActivity { public void handleColor(int color,int darkcolor){ //changing toolbar color if(getSupportActionBar()!=null){ getSupportActionBar().setBackgroundDrawable(new ColorDrawable(color)); } //if bigger than Api 21 change status bar color if(isLolipop()){ Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(darkcolor); } } public boolean isLolipop(){ return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; } } 

Al cambiar de color utilizo Selector de Color de Diálogo de Materiales. Ejemplo de apk: sample.apk y Github : material-dialogs . Si quieres ver cómo se ve, puedo darte un video de mi aplicación.

Colores de: Paleta de colores de materiales

De todos modos sé 2 enfoque diferente, si te gusta uno de ellos puedo explicar más.

@Edit : Buenas noticias para usted, encontré este reporte de Github: app-theme-engine y su funcionamiento bueno. Puede probar el ejemplo de apk. Si no puedes importarlo a través de gradle, prueba esto: compile 'com.github.naman14:app-theme-engine:0.5.1@aar'

Esto debe hacerse en los estilos / AppTheme.xml

Sólo es posible cambiar el tema de una actividad en el método onCreate() y que a sólo antes de super() se ha llamado. Cambiar el tema es bastante sencillo, algo como lo siguiente debe hacerlo:

setTheme(someBooleanFlag ? R.style.AppThemeOne : R.style.AppThemeTwo);

Leer más aquí:

El post medio de Ali Muzaffar sobre este tema

Estilos y temas

Tema material

  • Android KitKat: Todo el contenido de mi aplicación aparece detrás de ActionBar y StatusBar después de cambiar el color de StatusBar
  • Cambiar el color del icono de FAB basado en estado w / compat libs
  • Xamarin Android Añadir texto del botón todos los casquetes - ¿Cómo aplicar el estilo a través de la aplicación?
  • Explicación avanzada de las propiedades de diseño de Android?
  • Custom SearchView todo se puede hacer clic en android
  • ¿Cómo se utiliza obtenerStyledAttributes (int ) con temas internos de Android
  • Android - Tabla de estilos TableLayout
  • Cómo utilizar android: Theme.Material (tema material) en styles.xml android?
  • El estilo de botón predeterminado de Android no funciona
  • ¿Cómo puedo dar un estilo en negrita en android?
  • Android: Cambio de fondo en styles.xml
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.