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> 

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

  • Cómo Estilo ActionBar, ficha fondo en la pestaña seleccionada
  • Cambiar el color de Switch en Android
  • Cajón de navegación Cambia el fondo mientras se desplaza
  • Diferentes estilos de colorControlActivated en Android
  • ¿Cómo puedo dar un estilo en negrita en android?
  • Establecer un tema coherente para todos los editTexts en Android
  • Android Studio: ¿Cómo mover rápidamente el estilo de layout.xml a style.xml?
  • Explicación avanzada de las propiedades de diseño de Android?
  • No se establece el tema de Android
  • Android - Color del botón material
  • ¿Cómo hacer transparente AppCompat estilo?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.