Saya ingin memaksa tampilan sumber daya tata letak utama untuk menggambar ulang / menyegarkan, katakanlah metode Activity.onResume (). Bagaimana saya bisa melakukan ini?
Dengan tampilan tata letak utama, maksud saya yang ('Layarlay.mainscreen' di bawah) yang disebut di Activity.onCreate () saya, seperti ini: -
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainscreen);
}
Jawaban:
Untuk benar-benar menjawab pertanyaan: Gunakan invalidate ():
Sekarang, ketika Kegiatan dilanjutkan, itu membuat setiap Tampilan untuk menggambar sendiri. Tidak boleh ada panggilan untuk membatalkan (). Untuk menerapkan tema, pastikan Anda melakukannya sebelum Lihat apa pun diambil, yaitu sebelumnya
setContentView(R.layout.mainscreen);
Referensi dokumen API ada di sini: http://developer.android.com/reference/android/view/ContextThemeWrapper.html#setTheme%28int%29
Karena metode onDraw () berfungsi pada Views yang sudah dipakai, setTheme tidak akan berfungsi. Saya sendiri tidak punya pengalaman dengan tema, tetapi dua opsi alternatif yang bisa saya pikirkan adalah:
sumber
Mencoba
getWindow().getDecorView().findViewById(android.R.id.content).invalidate();
sumber
Coba
recreate()
ini akan menyebabkan Kegiatan ini diciptakan kembali.sumber
onResume
metode. Ini memberi saya infinte loop: /Larutan:
Guys Saya mencoba semua Solusi Anda tetapi mereka tidak bekerja untuk saya, saya harus mengatur setVisibility dari EditText ke VISIBLE dan EditText ini akan terlihat kemudian di ScrollView , tetapi saya tidak dapat me-refresh tampilan root untuk mulai berlaku. Saya memecahkan masalah saya, ketika saya perlu menyegarkan tampilan jadi saya mengubah visibilitas ScrollView ke GONE dan kemudian mengaturnya kembali ke VISIBLE untuk mengambil efek dan itu berhasil untuk saya. Ini bukan solusi yang tepat tetapi hanya berhasil.
sumber
Memanggil
invalidate()
ataupostInvalidate()
pada tata letak root tampaknya TIDAK menjamin bahwa tampilan anak-anak akan digambar ulang. Dalam kasus khusus saya, tata letak root saya adalah TableLayout dan memiliki beberapa anak dari kelas TableRow dan TextView. MemanggilpostInvalidate()
, ataurequestLayout()
atau bahkanforceLayout()
pada objek TableLayout root tidak menyebabkan TextViews di tata letak digambar ulang.Jadi, apa yang akhirnya saya lakukan adalah secara rekursif mengurai tata letak mencari TextViews tersebut dan kemudian memanggil
postInvalidate()
masing-masing objek TextView tersebut.Kode tersebut dapat ditemukan di GitHub: https://github.com/jkincali/Android-LinearLayout-Parser
sumber
Kalau tidak, Anda dapat mencoba ini juga-
sumber
Cukup atur tampilan konten Anda di onresume
setContentView (R.layout.yourview) di dalam onResume ..
Contoh:
sumber
Coba solusi ini untuk masalah tema:
sumber
Ini memungkinkan Anda memuat ulang dengan perubahan tema dan menyembunyikan animasinya.
sumber
Saya juga mengalami masalah ini, tetapi mengikuti petunjuk Farhan tentang penggunaan,
setContentView()
saya melakukannya. menggunakansetContentView()
dengan sendirinya tidak cukup. Saya menemukan bahwa saya harus mengisi kembali semua pandangan saya dengan informasi. Untuk memperbaikinya saya hanya menarik semua kode itu ke metode lain (saya menyebutnya build) dan dalamonCreate
metode saya, saya hanya memanggil build itu. Sekarang setiap kali acara saya terjadi bahwa saya ingin aktivitas saya "menyegarkan", saya sebut saja build, berikan informasi baru (yang saya sampaikan sebagai parameter untuk membangun) dan saya memiliki aktivitas yang disegarkan.sumber
Tampaknya ini adalah bug yang dikenal .
sumber
Saya tidak tahu apakah ini aman atau tidak tetapi itu berhasil untuk saya. Aku agak berlari ke dalam masalah ini sendiri dan mencoba
invalidate()
danrequestLayout()
tetapi tidak berhasil. Jadi saya baru saja menelepon sayaonCreate(null)
lagi dan berhasil. Jika ini tidak aman, harap beri tahu saya. Semoga ini bisa membantu seseorang di luar sana.sumber
Ini adalah bagaimana saya digunakan untuk Me-refresh tata letak saya
sumber
Untuk menghapus tampilan yang memperluas ViewGroup, Anda hanya perlu menggunakan metode ini
removeAllViews()
Sama seperti ini (jika Anda memiliki ViewGroup yang dipanggil
myElement
):sumber
Coba ini
sumber
Tidak yakin apakah itu pendekatan yang baik tetapi saya hanya menyebutnya setiap kali:
sumber
Panggil lagi aktivitas itu sendiri menggunakan niat. Misalnya untuk menyegarkan tata letak MainActivity, lakukan seperti ini:
sumber