Android – Cambiar el tema de la aplicación en onClick

Sé que hay una forma de cambiar el tema predeterminado de la aplicación al hacer clic en el botón. Los desarrolladores de Blackmart lo han hecho. Ya he buscado en Google como 1000 páginas pero encontré esto (no funciona)

getApplication().setTheme(Theme.Holo) 

Como ya creé un nuevo estilo en res / values ​​/ styles.xml, ¿hay alguna otra manera de cambiarlo dinámicamente? Incluso reiniciando la aplicación?

El siguiente blog puede resolver su problema:

http://mrbool.com/how-to-change-the-layout-theme-of-an-android-application/25837

Copiando el código del blog para referencia rápida:

Asumiendo que ya R.style.FirstTheme siguiendo tres temas en el archivo XML R.style.FirstTheme , R.style.SecondTheme y R.style.ThirdTheme

 import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; public class ChangeThemeActivity extends Activity implements OnClickListener { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Utils.onActivityCreateSetTheme(this); setContentView(R.layout.main); findViewById(R.id.button1).setOnClickListener(this); findViewById(R.id.button2).setOnClickListener(this); findViewById(R.id.button3).setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.button1: Utils.changeToTheme(this, Utils.THEME_DEFAULT); break; case R.id.button2: Utils.changeToTheme(this, Utils.THEME_WHITE); break; case R.id.button3: Utils.changeToTheme(this, Utils.THEME_BLUE); break; } } } 

Escribamos el siguiente código en el archivo “Utils”:

 import android.app.Activity; import android.content.Intent; public class Utils { private static int sTheme; public final static int THEME_DEFAULT = 0; public final static int THEME_WHITE = 1; public final static int THEME_BLUE = 2; /** * Set the theme of the Activity, and restart it by creating a new Activity of the same type. */ public static void changeToTheme(Activity activity, int theme) { sTheme = theme; activity.finish(); activity.startActivity(new Intent(activity, activity.getClass())); } /** Set the theme of the activity, according to the configuration. */ public static void onActivityCreateSetTheme(Activity activity) { switch (sTheme) { default: case THEME_DEFAULT: activity.setTheme(R.style.FirstTheme); break; case THEME_WHITE: activity.setTheme(R.style.SecondTheme); break; case THEME_BLUE: activity.setTheme(R.style.Thirdheme); break; } } } 

Espero eso ayude…

EDIT 1:

siguiente es el motivo por el que AlertDialog no acepta el tema personalizado:

La implementación en Builder.create () es:

 public AlertDialog create() { final AlertDialog dialog = new AlertDialog(P.mContext); P.apply(dialog.mAlert); [...] } 

que llama al constructor de AlertDialog “no sensible al tema”, que se ve así:

 protected AlertDialog(Context context) { this(context, com.android.internal.R.style.Theme_Dialog_Alert); } 

Hay un segundo constructor en AlertDialog para cambiar los temas:

 protected AlertDialog(Context context, int theme) { super(context, theme); [...] } 

que el Constructor simplemente no llama.

Consulte la siguiente publicación para obtener soluciones más relevantes.

Cómo cambiar el tema para AlertDialog

La siguiente es la respuesta más votada:

  new AlertDialog.Builder( new ContextThemeWrapper(context, android.R.style.Theme_Dialog))