Saya mencoba menyetel tema untuk sebuah fragmen.
Menyetel tema di manifes tidak berfungsi:
android:theme="@android:style/Theme.Holo.Light"
Dari melihat blog sebelumnya, sepertinya saya harus menggunakan ContextThemeWrapper. Adakah yang bisa merujuk saya ke contoh berkode? Saya tidak dapat menemukan apa pun.
android
android-fragments
android-theme
pengguna1232691
sumber
sumber
Fragmen mengambil temanya dari Aktivitasnya. Setiap fragmen diberi tema Activity tempatnya ada.
Tema diterapkan dalam metode Fragment.onCreateView, di mana kode Anda membuat tampilan, yang sebenarnya merupakan objek tempat tema digunakan.
Di Fragment.onCreateView Anda mendapatkan parameter LayoutInflater, yang memekarkan tampilan, dan memegang Konteks yang digunakan untuk tema, sebenarnya ini adalah Aktivitas. Jadi tampilan meningkat Anda menggunakan tema Activity.
Untuk mengganti tema, Anda dapat memanggil LayoutInflater.cloneInContext , yang menyebutkan di Dokumen bahwa itu mungkin digunakan untuk mengubah tema. Anda dapat menggunakan ContextThemeWrapper di sini. Kemudian gunakan inflater kloning untuk membuat tampilan fragmen.
sumber
Untuk menerapkan satu gaya yang baru saja saya gunakan
di
onCreateView()
dalam fragmen sebelum meluaskan tampilan root dari fragmen tersebut dan itu berfungsi untuk saya.sumber
getContext()
Saya juga mencoba menampilkan dialog fragmen dengan tema yang berbeda dengan aktivitasnya, dan mengikuti solusi ini . Seperti beberapa orang yang disebutkan dalam komentar, saya tidak membuatnya berfungsi dan dialog terus ditampilkan dengan tema yang ditentukan dalam manifes. Masalahnya ternyata bahwa saya membangun dialog menggunakan
AlertDialog.Builder
dalamonCreateDialog
metode dan jadi tidak membuat penggunaanonCreateView
metode seperti ditunjukkan pada jawaban yang saya terhubung. Dan ketika saya memberi contoh,AlertDialog.Builder
saya meneruskan dalam konteks menggunakangetActivity()
ketika saya seharusnya menggunakan yang dipakaiConstextThemeWrapper
sebagai gantinya.Ini kode untuk onCreateDialog saya:
Saya awalnya memiliki
AlertDialog.Builder
yang dipakai sebagai berikut:yang saya ubah menjadi:
Setelah perubahan ini, dialog fragmen ditampilkan dengan tema yang benar. Jadi, jika ada orang lain yang mengalami masalah serupa dan memanfaatkannya,
AlertDialog.Builder
periksa konteks yang diteruskan ke pembuat. Semoga ini membantu! :)sumber
Pastikan Anda telah
android:minSdkVersion="11"
mengatur dalam manifes Anda. Ini bisa menjadi penyebab mengapa teladan David tidak berhasil untuk Anda.Juga, mengatur
android:theme="@android:style/Theme.Holo.Light"
atribut untuk<application>
tag dan TIDAK yang<activity>
tag.Masalah lain yang mungkin mungkin adalah cara Anda mendapatkan Konteks saat menggunakan file
ContextThemeWrapper()
. Jika Anda menggunakan sesuatu sepertigetActivity().getApplicationContext()
gantigetActivity()
saja.Biasanya, Theme.Holo harus diterapkan ke Fragmen yang ditautkan ke MainActivity.
Harap dicatat bahwa Anda menggunakan ContextThemeWrapper saat Anda ingin menerapkan tema yang berbeda untuk Fragmen Anda. Mungkin membantu jika Anda memberikan potongan kode, dari MainActivity, tempat Anda menambahkan Fragmen.
Beberapa tautan berguna:
ListView Kustom di Fragmen tidak mengikuti tema induk
sumber
Saya mencoba solusi yang disarankan David itu berhasil tetapi tidak di semua skenario:
1. untuk fragmen pertama yang ditambahkan ke tumpukan memiliki tema aktivitas dan bukan yang ditentukan di onCrateView, tetapi pada fragmen kedua yang saya tambahkan ke tumpukan yang benar, mereka diterapkan pada fragmen.
2. Pada fragmen kedua yang ditampilkan dengan benar, saya melakukan hal berikut saya memaksa Aplikasi ditutup dengan membersihkan memori, membuka kembali Aplikasi dan ketika Aktivitas dibuat ulang dengan fragmen Fragmen itu mengubahnya menjadi salah Aktivitas dan tidak sama dengan yang disetel di onCrateView dari fragmen.
Untuk memperbaiki masalah saya melakukan perubahan kecil dan mengganti argumen kontainer dari inflater.inflate dengan null.
saya tidak tahu cara inflater menggunakan dalam beberapa skenario konteks dari tampilan kontainer.
Catatan - bahwa saya menggunakan android.support.v4.app.Fragment & android.support.v7.app.AppCompatActivity.
sumber
Saya tahu ini agak terlambat tetapi mungkin membantu orang lain karena ini membantu saya. Anda juga dapat mencoba menambahkan baris kode di bawah ini di dalam fungsi onCreatView dari fragmen
sumber
Buat kelas java dan kemudian gunakan tata letak yang ingin Anda ubah temanya di metode onCreate. Lalu sebutkan di manifes seperti biasa
sumber
Jika Anda hanya ingin menerapkan gaya untuk fragmen tertentu, cukup tambahkan baris ini sebelum memanggil
onCreateView()
atauonAttach()
fragmen,dan Jika Anda ingin menyetel status bar transparan kemudian menyetel false ke
fitsSystemWindows
properti tata letak root Anda,sumber
Saya membuatnya bekerja dengan menyetel tema pada konteks fragmen sebelum memanggil inflator.
CATATAN: Ini adalah contoh untuk Xamarin.Android yang dikombinasikan dengan MvvmCross. Saya tidak 100% yakin apakah ini juga akan berhasil untuk programmer Java. Tapi Anda bisa mencoba :)
Kode metode ekstensi SetTheme
Saya harap ini membantu beberapa orang, cheers!
sumber
Saya memecahkan masalah menggunakan
android:theme = "@style/myTheme"
file tata letak fragmen. Misalnya ini mengubah gaya dariLinearLayout
dan isinya tetapi tidak ada hal di luarLinearLayout
. Jadi, untuk mendekorasi seluruh fragmen dengan gaya apa pun, terapkan tema ke tata letak induk paling luarnya.Catatan: Untuk berjaga-jaga jika Anda belum menemukan solusi, Anda dapat mencobanya.
sumber
Anda dapat mencoba ini untuk lollipop di onAttach
Jendela terakhir jendela = activity.getWindow (); window.setStatusBarColor (myStatusBarColor)
dan setel kembali ke default di ondettach
sumber