Setelah saya melakukan beberapa perubahan dalam database saya, yang melibatkan perubahan signifikan dalam pandangan saya, saya ingin menggambar ulang, menjalankan ulang onCreate.
Bagaimana mungkin?
UPDATE : Android SDK 11 menambahkan recreate()
metode ke aktivitas.
Saya telah melakukannya dengan hanya menggunakan kembali maksud yang memulai aktivitas. Tentukan maksud starterIntent
di kelas Anda dan tetapkan dalam onCreate()
penggunaan starterIntent = getIntent();
. Kemudian saat Anda ingin memulai kembali aktivitas, panggilfinish(); startActivity(starterIntent);
Ini bukanlah solusi yang sangat elegan, tetapi ini adalah cara sederhana untuk memulai kembali aktivitas Anda dan memaksanya untuk memuat ulang semuanya.
finish()
segera setelahstartActivity()
alasan itu ...finish();
kemudianstartActivity(starterIntent);
Panggil metode rekonstruksi dari aktivitas tersebut.
sumber
recreate()
tetapi sekarang saya melihat masalah aneh di mana tombol radio tidak diatur ulang saat membuat ulang, tetapi mereka melakukannya ketikafinish(); startActivity(getIntent());
jadi saya menggunakan ini untuk saat ini dan melihat cara kerjanya selama beberapa hari atau minggu berikutnya.Menggabungkan beberapa jawaban di sini Anda dapat menggunakan sesuatu seperti berikut ini.
Menguji
Saya mengujinya sedikit, dan ada beberapa masalah:
startActivity(...); finish();
hanya ada aplikasi dan tidak memulai ulang aktivitas.super.recreate()
sebenarnya tidak bertindak dengan cara yang sama seperti membuat ulang aktivitas secara total. Hal ini setara dengan memutar perangkat jadi jika Anda memilikiFragment
s dengansetRetainInstance(true)
mereka tidak akan diciptakan; hanya berhenti dan melanjutkan.Jadi saat ini saya tidak percaya ada solusi yang dapat diterima.
sumber
Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB
alih-alih menggunakan11
startActivity(getIntent());finish();
kefinish();startActivity(getIntent());
Pilihan 1
Hubungi
recreate()
AndaActivity
. Namun metode ini menyebabkan layar hitam berkedip muncul selama pembuatan ulang aktivitas.pilihan 2
Tidak ada layar hitam "berkedip" di sini, tetapi Anda akan melihat transisi antara yang lama dan yang baru dengan latar belakang hitam yang tidak terlalu menyenangkan. Kami bisa lebih baik.
Opsi 3
Untuk mengatasinya, kita dapat menambahkan panggilan ke
overridePendingTransition()
:Selamat tinggal layar hitam, tetapi dalam kasus saya, saya masih melihat semacam transisi (animasi pudar), pada latar belakang berwarna kali ini. Itu karena Anda menyelesaikan instance aktivitas Anda saat ini sebelum yang baru dibuat dan menjadi terlihat sepenuhnya, dan warna di antaranya adalah nilai
windowBackground
atribut tema.Pilihan 4
Menelepon
finish()
setelahstartActivity()
akan menggunakan transisi default antar aktivitas, seringkali dengan sedikit animasi geser ke dalam. Tetapi transisi masih terlihat.Pilihan 5
Bagi saya, ini adalah solusi terbaik karena memulai ulang aktivitas tanpa transisi yang terlihat, seperti jika tidak ada yang terjadi.
Ini bisa berguna jika, misalnya, di aplikasi Anda, Anda menunjukkan cara untuk mengubah bahasa tampilan secara independen dari bahasa sistem. Dalam kasus ini, setiap kali pengguna mengubah bahasa aplikasi Anda, Anda mungkin ingin memulai kembali aktivitas tanpa transisi, sehingga peralihan bahasa terlihat seketika.
sumber
Ketika saya perlu memulai kembali suatu aktivitas, saya menggunakan kode berikut. Padahal itu tidak disarankan.
sumber
untuk API sebelum 11 Anda tidak dapat menggunakan reinate (). Saya menyelesaikannya dengan cara ini:
dan di onCreate ..
sumber
Setelah mencari implementasi untuk roti jahe
recreate
, saya ingin menggunakan kode berikut (untuk roti jahe):Untuk kode-kode ini, itu dari implementasi di api yang lebih tinggi.
Api-10 tidak memiliki requestRelaunchActivity, namun, dari diff, saya menemukan ini:
Jadi saya pikir saya bisa menggunakan
scheduleRelaunchActivity
bukanrequestRelaunchActivity
.Dan saya telah menuliskannya menggunakan refleks:
Saya menggunakan kode ini untuk porting belakang kerangka xposed.
sumber
Build.VERSION_CODES.ECLAIR_MR1
(v7). Ini mungkin bekerja pada versi yang lebih lama juga.Panggil
recreate()
metode dari tempat Anda ingin membuat ulang aktivitas Anda. Metode ini akan menghancurkan instance Aktivitas saat ini denganonDestroy()
dan kemudian membuat ulang aktivitas denganonCreate()
.sumber
Jika ini adalah masalah Anda, Anda mungkin harus mengimplementasikan cara lain untuk mengisi tampilan di Aktivitas Anda. Alih-alih menjalankan kembali
onCreate()
Anda harus membuatnya sehinggaonCreate()
memanggil metode pengisian Anda dengan beberapa argumen. Ketika data berubah, metode pengisian harus dipanggil dengan argumen lain.sumber
Cara saya mengatasinya adalah dengan menggunakan Fragmen . Ini kompatibel mundur hingga API 4 dengan menggunakan pustaka dukungan.
Anda membuat tata letak "pembungkus" dengan FrameLayout di dalamnya.
Contoh:
Kemudian Anda membuat FragmentActivity di mana Anda dapat mengganti FrameLayout kapan pun Anda mau.
Contoh:
Di Fragmen yang Anda kembangkan / ganti, Anda bisa menggunakan onStart dan onCreateView seperti biasanya Anda menggunakan onCreate dari suatu aktivitas.
Contoh:
sumber
Juga tergantung pada situasi Anda, Anda mungkin perlu
getActivity().recreate();
daripada hanyarecreate()
.Misalnya, Anda harus menggunakannya jika Anda melakukan
recreate()
di kelas yang telah dibuat di dalam kelas aktivitas.sumber
Saya pernah membuat aplikasi uji coba yang mengupload, menghapus, lalu mendownload ulang file database menggunakan penyimpanan cloud firebase. Untuk menampilkan data dalam database, kode berikut adalah satu-satunya solusi yang saya temukan. Baik
recreate()
ataufinish()
bekerja dalam kasus ini.sumber
Saya menemukan cara terbaik untuk menyegarkan Fragmen Anda saat data berubah
jika Anda memiliki tombol "cari", Anda harus menginisialisasi daftar ARRAY Anda di dalam tombol tersebut
mSearchBtn.setOnClickListener (baru View.OnClickListener () {
@Override public void onClick (Tampilan v) {
sumber
Jika Anda ingin meneruskan parameter ke onCreate () maka Anda harus membuat maksud baru dengan menambahkan ekstra dan memanggil StartActivity dengannya. Berikut adalah contoh sederhana yang saya lakukan dengan cara ini.
sumber
Jika Anda hanya ingin mengulang pandangan Anda, saya mengalami masalah yang persis sama. Dalam
onResume
fungsinya coba letakkan ini:Ini juga ada di saya
onCreate()
, jadi meletakkan ini dionResume
berhasil untuk saya :)sumber