Cómo cambiar el tema actual en tiempo de ejecución en Android

He creado una PreferenceActivity que permite al usuario elegir el tema que quiere aplicar a toda la aplicación.

Cuando el usuario selecciona un tema, este código se ejecuta:

if (...) { getApplication().setTheme(R.style.BlackTheme); } else { getApplication().setTheme(R.style.LightTheme); } 

Pero, aunque he comprobado con el depurador que el código se está ejecutando, no puedo ver ningún cambio en la interfaz de usuario.

Los temas se definen en res/values/styles.xml y Eclipse no muestra ningún error.

 <resources> <style name="LightTheme" parent="@android:style/Theme.Light"> </style> <style name="BlackTheme" parent="@android:style/Theme.Black"> </style> </resources> 

¿Alguna idea sobre lo que podría estar sucediendo y cómo solucionarlo? ¿Debo llamar a setTheme en cualquier punto especial del código? Mi aplicación consta de varias actividades si eso ayuda.

Me gustaría ver el método también, donde se establece una vez para todas sus actividades. Pero por lo que sé que tienes que establecer en cada actividad antes de mostrar cualquier punto de vista.

Para referencia, compruebe lo siguiente:

http://www.anddev.org/applying_a_theme_to_your_application-t817.html

Editar (copiado de ese foro):

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Call setTheme before creation of any(!) View. setTheme(android.R.style.Theme_Dark); // ... setContentView(R.layout.main); } 

Si desea cambiar el tema de una actividad ya existente, llame a recreate() después de setTheme() .

Nota: no llame a recrear si cambia el tema en onCreate() , para evitar un bucle infinito.

Tengo el mismo problema, pero encontré la solución.

 public class EditTextSmartPhoneActivity extends Activity implements DialogInterface.OnClickListener { public final static int CREATE_DIALOG = -1; public final static int THEME_HOLO_LIGHT = 0; public final static int THEME_BLACK = 1; int position; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { position = getIntent().getIntExtra("position", -1); switch(position) { case CREATE_DIALOG: createDialog(); break; case THEME_HOLO_LIGHT: setTheme(android.R.style.Theme_Holo_Light); break; case THEME_BLACK: setTheme(android.R.style.Theme_Black); break; default: } super.onCreate(savedInstanceState); setContentView(R.layout.main); } private void createDialog() { /** Options for user to select*/ String choose[] = {"Theme_Holo_Light","Theme_Black"}; AlertDialog.Builder b = new AlertDialog.Builder(this); /** Setting a title for the window */ b.setTitle("Choose your Application Theme"); /** Setting items to the alert dialog */ b.setSingleChoiceItems(choose, 0, null); /** Setting a positive button and its listener */ b.setPositiveButton("OK",this); /** Setting a positive button and its listener */ b.setNegativeButton("Cancel", null); /** Creating the alert dialog window using the builder class */ AlertDialog d = b.create(); /** show dialog*/ d.show(); } @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub AlertDialog alert = (AlertDialog)dialog; int position = alert.getListView().getCheckedItemPosition(); finish(); Intent intent = new Intent(this, EditTextSmartPhoneActivity.class); intent.putExtra("position", position); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } } 

Recreate recreate() (como se menciona por TPReal ) sólo reiniciará la actividad actual, pero las actividades anteriores seguirán estando en la pila trasera y el tema no se aplicará a ellos.

Por lo tanto, otra solución para este problema es volver a crear la pila de tareas por completo, como esto:

  TaskStackBuilder.create(getActivity()) .addNextIntent(new Intent(getActivity(), MainActivity.class)) .addNextIntent(getActivity().getIntent()) .startActivities(); 

EDITAR:

Sólo tiene que poner el código de arriba después de realizar el cambio de tema en la interfaz de usuario o en otro lugar. Todas sus actividades deben tener el método setTheme() llamado before onCreate() , probablemente en alguna actividad de los padres. También es un método normal para almacenar el tema elegido en SharedPreferences , leerlo y luego establecerlo utilizando el método setTheme() .

Tenemos que configurar el tema antes de llamar al método 'super.onCreate ()' y 'setContentView ()' .

Echa un vistazo a este enlace para aplicar el nuevo tema a toda la aplicación en tiempo de ejecución.

Tuve un problema similar y lo resolví de esta manera ..

 @Override public void onCreate(Bundle savedInstanceState) { if (getIntent().hasExtra("bundle") && savedInstanceState==null){ savedInstanceState = getIntent().getExtras().getBundle("bundle"); } //add code for theme switch(theme) { case LIGHT: setTheme(R.style.LightTheme); break; case BLACK: setTheme(R.style.BlackTheme); break; default: } super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //code } 

Este código es para recrear el Paquete de ahorro de actividad y cambiar el tema. Usted tiene que escribir su propio onSaveInstanceState (Bundle outState); Desde API-11 puede utilizar el método recreate () en su lugar

 Bundle temp_bundle = new Bundle(); onSaveInstanceState(temp_bundle); Intent intent = new Intent(this, MainActivity.class); intent.putExtra("bundle", temp_bundle); startActivity(intent); finish(); 

Sé que estoy tarde, pero me gustaría publicar una solución aquí: Compruebe el código fuente completo aquí . Este es el código que usé al cambiar el tema usando preferencias.

 SharedPreferences pref = PreferenceManager .getDefaultSharedPreferences(this); String themeName = pref.getString("prefSyncFrequency3", "Theme1"); if (themeName.equals("Africa")) { setTheme(R.style.AppTheme); } else if (themeName.equals("Colorful Beach")) { //Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show(); setTheme(R.style.beach); } else if (themeName.equals("Abstract")) { //Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show(); setTheme(R.style.abstract2); } else if (themeName.equals("Default")) { setTheme(R.style.defaulttheme); } 

Esto es lo que he creado para el diseño del material. Que le sea útil.

Echa un vistazo a MultipleThemeMaterialDesign

De esta manera trabajo para mí:

  @Override protected void onCreate(Bundle savedInstanceState) { setTheme(GApplication.getInstance().getTheme()); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } 

A continuación, desea cambiar un nuevo tema:

 GApplication.getInstance().setTheme(R.style.LightTheme); recreate(); 

Puedes terminar la Acivity y recrearla después de esta manera tu actividad se creará de nuevo y todas las vistas se crearán con el nuevo tema.

En lugar de

 getApplication().setTheme(R.style.BlackTheme); 

utilizar

 setTheme(R.style.BlackTheme); 

Mi código: in onCreate () método:

 super.onCreate(savedInstanceState); if(someExpression) { setTheme(R.style.OneTheme); } else { setTheme(R.style.AnotherTheme); } setContentView(R.layout.activity_some_layout); 

En algún lugar (por ejemplo, con un clic de botón):

 YourActivity.this.recreate(); 

Usted tiene que recrear la actividad, de lo contrario – el cambio no sucederá

Llame a SetContentView (Resource.Layout.Main) después de setTheme ().

Esto no tuvo ningún efecto para mí:

 public void changeTheme(int newTheme) { setTheme(newTheme); recreate(); } 

Pero esto funcionó:

 int theme = R.style.default; protected void onCreate(Bundle savedInstanceState) { setTheme(this.theme); super.onCreate(savedInstanceState); } public void changeTheme(int newTheme) { this.theme = newTheme; recreate(); } 
  • ¿Cómo setTheme a una actividad en tiempo de ejecución? No funciona llamada setTheme antes onCreate y setContentView
  • java.lang.UnsupportedOperationException: No se puede convertir a dimension: type = 0x12
  • Cambiar el estilo de AlertDialog
  • ¿Cómo usar los iconos y la plantilla incorporados?
  • ¿Cómo se cambia el color de texto de los elementos de la lista en un AlertDialog
  • Eliminar el efecto sombra en el botón android
  • SetTheme que no cambia los colores del tema
  • Deje que el usuario elija un tema
  • Cambiar dinámicamente el tema de la actividad
  • Cómo cambiar el color detrás de Android Dialog
  • Nombre del tema de Android del ID de tema
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.