2012-07-19 17 views
65

En casos particulares, necesito eliminar el tema del diálogo de mi actividad, pero parece que no funciona. He aquí un ejemploCambiar el tema de la actividad programáticamente

Primera actividad:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    startActivity(new Intent(MainActivity.this, SecondActivity.class)); 
} 

Segunda acción:

public void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setTheme(android.R.style.Theme); 
    setContentView(R.layout.activity_second); 
} 

extracto Manifiesto:

<activity android:name="SecondActivity" android:theme="@android:style/Theme.Dialog"></activity> 

Cuando corro todavía está diálogo de temas.

API10

Thanks.

Respuesta

108

Como docs dice que tiene que llamar al setTheme antes de cualquier salida de vista. Parece que super.onCreate() toma parte en el procesamiento view.

Así, para cambiar entre los temas de forma dinámica sólo hay que llamar setTheme antes super.onCreate así:

public void onCreate(Bundle savedInstanceState) { 
    setTheme(android.R.style.Theme); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_second); 
} 
+7

no funciona para mí – oscarthecat

+0

@oscarthecat, ¿lo tienes funcionando? ¿Cuál fue tu solución si es así? – nmxprime

+0

Funciona para mí en MotoG (v1) con stack Android 5.1. Si no funciona para usted, comparta dispositivo + versión de Android. – lenrok258

8

Sé que llego tarde, pero me gustaría publicar una solución aquí:
efectuar periódicamente código fuente here.
Este es el código que utilicé cuando se cambia el tema utilizando las 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); 

} 

Tenga en cuenta que usted tiene que poner el código antes de setContentView ..

CODIFICACIÓN FELIZ!

+0

por qué? la respuesta es corect ?! – dondondon

9

La respuesta de user1462299 funciona muy bien, pero si incluye fragmentos, usarán el tema de actividades original. Para aplicar el tema a todos los fragmentos, así se puede anular el getTheme() método de la Contexto lugar:

@Override 
public Resources.Theme getTheme() { 
    Resources.Theme theme = super.getTheme(); 
    if(useAlternativeTheme){ 
     theme.applyStyle(R.style.AlternativeTheme, true); 
    } 
    // you could also use a switch if you have many themes that could apply 
    return theme; 
} 

No es necesario llamar setTheme() en el onCreate() Método más. Está anulando todas las solicitudes para obtener el tema actual en este contexto de esta manera.

+0

@ quien bajó la votación: ¿te importa explicar lo que no te gusta de mi respuesta? –

+0

¿Debería anular getTheme() en la Actividad o en los Fragmentos respectivos? Lo he implementado en la Actividad, pero los Fragmentos todavía están usando el tema de Actividad original. – saltandpepper

+0

@saltandpepper Anularlo en la Actividad es suficiente. Asegúrese de que el código de fragmento y el diseño no lo vuelvan a cambiar. –

Cuestiones relacionadas