Ubah tema Aktivitas secara terprogram

121

Dalam kasus tertentu saya perlu menghapus tema dialog dari aktivitas saya tetapi sepertinya tidak berhasil. Berikut contohnya

Aktivitas pertama:

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

Aktivitas kedua:

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

Kutipan manifes:

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

Saat dijalankan masih bertema dialog.

API10

Terima kasih.

pengguna1462299
sumber

Jawaban:

183

Seperti yang dikatakan oleh dokumen Anda harus memanggil setThemesebelum ada keluaran tampilan. Tampaknya super.onCreate()mengambil bagian dalam viewpemrosesan.

Jadi, untuk beralih antar tema secara dinamis Anda hanya perlu memanggil setThemedulu super.onCreateseperti ini:

public void onCreate(Bundle savedInstanceState) {
    setTheme(android.R.style.Theme);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
}
pengguna1462299
sumber
Bekerja untuk saya di MotoG (v1) dengan tumpukan Android 5.1. Jika tidak berfungsi untuk Anda, silakan bagikan perangkat + versi android.
lenrok258
Saya harus mendefinisikan tema seperti yang dijelaskan di sini: stackoverflow.com/a/44236460/3211335 Dan kemudian mengaturnya seperti yang dijelaskan oleh jawaban ini. Ini bekerja dengan baik.
LaloLoop
Adakah yang bisa kita atur tema hanya sekali ... alih-alih mengatur tema per halaman
gayan1991
Saya menggunakan preferensi bersama untuk menyimpan tema tetapi saat memulai ulang aplikasi, untuk sesaat tema pertama muncul, lalu tema kedua ditampilkan!
Mohammad Afrashteh
1
@ gayan1991 Anda dapat menggunakan aktivitas lain untuk menentukan tema Anda dan membuat semua aktivitas Anda yang lain memperluas yang satu ini misalnya: pastebin.com/r93qrRDG edit: gunakan pastebin untuk mendapatkan format yang lebih baik
SocialSupaCrew
46

Respons user1462299 berfungsi dengan baik, tetapi jika Anda menyertakan fragmen , mereka akan menggunakan tema aktivitas asli. Untuk menerapkan tema ke semua fragmen juga, Anda bisa mengganti metode getTheme () dari Context sebagai gantinya:

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

Anda tidak perlu memanggil setTheme () dalam Metode onCreate () lagi. Anda mengganti setiap permintaan untuk mendapatkan tema saat ini dalam konteks ini dengan cara ini.

Björn Kechel
sumber
2
@ siapa pun yang memberikan suara negatif: mau menjelaskan apa yang tidak Anda sukai tentang tanggapan saya?
Björn Kechel
Haruskah getTheme () diganti dalam Aktivitas, atau di Fragmen masing-masing? Saya telah menerapkan ini di Aktivitas, tetapi Fragmen masih menggunakan tema Aktivitas asli.
saltandpepper
@saltandpepper Menggantinya dalam Aktivitas sudah cukup. Pastikan kode fragmen dan tata letak Anda tidak mengubahnya lagi.
Björn Kechel
Ini tidak berhasil untuk saya, tetapi jawaban yang disediakan di stackoverflow.com/a/15496425/494179 berhasil.
saltandpepper
2
Poin pengguna yang baik1269737 jadi Anda harus memastikan bahwa tidak ada perhitungan yang berat. Mengembalikan gaya dalam kasus kondisi sederhana tidak akan memengaruhi kinerja.
Björn Kechel
12

Saya tahu bahwa saya terlambat tetapi saya ingin memposting solusi di sini:
Periksa kode sumber lengkap di sini .
Ini adalah kode yang saya gunakan saat mengubah tema menggunakan preferensi ..

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

}

Harap dicatat bahwa Anda harus meletakkan kode sebelum setcontentview ..

HAPPY CODING!

dondondon.dll
sumber
Mengapa? jawabannya benar ?!
dondondon
Saya menggunakan preferensi bersama untuk menyimpan tema tetapi saat memulai ulang aplikasi, untuk sesaat tema pertama muncul, lalu tema kedua ditampilkan!
Mohammad Afrashteh
0

Yang ini berfungsi dengan baik untuk saya:

theme.applyStyle(R.style.AppTheme, true)

Pemakaian:

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    //The call goes right after super.onCreate() and before setContentView()
    theme.applyStyle(R.style.AppTheme, true)
    setContentView(layoutId)
    onViewCreated(savedInstanceState)
}
Tamim Attafi
sumber