2012-07-19 20 views
65

In casi particolari, ho bisogno di rimuovere il tema di dialogo dalla mia attività ma non sembra funzionare. Ecco un esempioCambia tema del tema di attività a livello di programmazione

Prima attività:

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

Seconda azione:

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

manifesto estratto:

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

Quando eseguo è ancora Finestra di dialogo a tema.

API10

Grazie.

risposta

108

Come docs dire che devi chiamare setTheme prima di qualsiasi uscita di visualizzazione. Sembra che super.onCreate() partecipi all'elaborazione view.

Così, per passare tra i temi in modo dinamico è sufficiente chiamare setTheme prima super.onCreate come questo:

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

non funziona per me – oscarthecat

+0

@oscarthecat, hai funzionato? Qual è stata la tua correzione in caso affermativo? – nmxprime

+0

Funziona per me su MotoG (v1) con stack Android 5.1. Se non funziona per te condividi dispositivo + versione di Android. – lenrok258

8

so che sono in ritardo, ma vorrei inviare una soluzione qui:
Controllare il pieno codice sorgente here.
Questo è il codice che ho usato quando si cambia tema utilizzando le preferenze ..

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); 

} 

prega di notare che è necessario mettere il codice prima setContentView ..

FELICE codifica!

+0

perché? la risposta è corretta ?! – dondondon

9

La risposta dell'utente 14142299 funziona benissimo, ma se si includono i frammenti, verrà utilizzato il tema delle attività originali. Per applicare il tema per tutti i frammenti, come ben si può ignorare () il metodo del Contesto invece il getTheme:

@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; 
} 

Non è necessario chiamare setTheme() nella onCreate() Il metodo più. Stai sovrascrivendo ogni richiesta per ottenere il tema attuale in questo contesto in questo modo.

+0

@ whoever downvoted: ti interessa spiegare cosa non ti piace della mia risposta? –

+0

Dovrebbe getTheme() essere sovrascritto nell'attività o nei rispettivi frammenti? L'ho implementato nell'attività, ma i frammenti stanno ancora utilizzando il tema dell'attività originale. – saltandpepper

+0

@saltandpepper Sovrascriverlo nell'attività è sufficiente. Assicurati che il codice e il layout del frammento non cambino di nuovo. –

Problemi correlati