Dalam hal ini digunakan untuk beberapa pengembang yang lebih baru karena tidak ditentukan di atas. Hanya untuk menjadi sangat eksplisit:
Anda memerlukan dua hal jika menggunakan onConfigurationChanged :
Sebuah onConfigurationChangedmetode dalam Anda Kelas Aktivitas
Tentukan dalam manifes Anda perubahan konfigurasi mana yang akan ditangani olehonConfigurationChanged metode Anda
Cuplikan manifes dalam jawaban di atas, meskipun tidak diragukan lagi benar untuk aplikasi tertentu yang memiliki manifes, BUKAN persis seperti yang perlu Anda tambahkan dalam manifes untuk memicu metode onConfigurationChanged di Kelas Aktivitas Anda. yaitu entri manifes di bawah ini mungkin tidak benar untuk aplikasi Anda.
<activity name= ".MainActivity" android:configChanges="orientation|screenSize"/>
Dalam entri manifes di atas, ada berbagai tindakan Android android:configChanges=""yang bisa memicu onCreate dalam siklus hidup Aktivitas Anda.
Ini sangat penting - Yang TIDAK Ditentukan dalam manifes adalah yang memicu onCreate Anda dan Yang ditentukan dalam manifes adalah yang memicu onConfigurationChangedmetode Anda Anda di Kelas Aktivitas.
Jadi, Anda perlu mengidentifikasi perubahan konfigurasi mana yang perlu Anda tangani sendiri. Untuk Android Encyclopedically Challenged seperti saya, saya menggunakan pop-out petunjuk cepat di Android Studio dan menambahkan di hampir setiap opsi konfigurasi yang memungkinkan. Mendaftar semua ini pada dasarnya mengatakan bahwa saya akan menangani semuanya dan onCreate tidak akan pernah dipanggil karena konfigurasi.
<activity name= ".MainActivity" android:configChanges="screenLayout|touchscreen|mnc|mcc|density|uiMode|fontScale|orientation|keyboard|layoutDirection|locale|navigation|smallestScreenSize|keyboardHidden|colorMode|screenSize"/>
Sekarang jelas saya tidak ingin menangani semuanya, jadi saya mulai menghilangkan opsi di atas satu per satu. Membangun kembali dan menguji aplikasi saya setelah setiap penghapusan.
Poin penting lainnya : Jika hanya ada satu opsi konfigurasi yang ditangani secara otomatis yang memicu onCreate Anda (Anda tidak memilikinya tercantum dalam manifes Anda di atas), maka akan muncul sepertionConfigurationChanged tidak berfungsi. Anda harus memasukkan semua yang relevan ke dalam manifes Anda.
Saya berakhir dengan 3 yang awalnya memicu onCreate, kemudian saya menguji S10 + dan saya masih mendapatkan onCreate, jadi saya harus melakukan latihan eliminasi lagi dan saya juga membutuhkan |screenSize. Jadi uji pada beberapa platform.
<activity name= ".MainActivity" android:configChanges="screenLayout|uiMode|orientation|screenSize"/>
Jadi saran saya, meskipun saya yakin seseorang bisa membuat lubang di sini:
Tambahkan onConfigurationChangedmetode Anda di Kelas Aktivitas dengan TOAST atau LOG sehingga Anda dapat melihat kapan metode tersebut berfungsi.
Tambahkan semua opsi konfigurasi yang memungkinkan ke manifes Anda.
Konfirmasikan bahwa onConfigurationChangedmetode Anda berfungsi dengan menguji aplikasi Anda.
Hapus setiap opsi konfigurasi dari file manifes Anda satu per satu, uji aplikasi Anda setelahnya.
Uji pada sebanyak mungkin variasi perangkat.
Jangan salin / tempel cuplikan saya di atas ke file manifes Anda. Pembaruan Android mengubah daftar, jadi gunakan petunjuk Android Studio yang muncul untuk memastikan Anda mendapatkan semuanya.
Saya harap ini menghemat waktu seseorang.
onConfigurationChangedCara saya hanya untuk info dibawah ini. onConfigurationChangeddipanggil dalam siklus proses setelah orientasi baru tersedia, tetapi sebelum UI dibuat ulang. Oleh karena itu pertama saya ifuntuk memeriksa orientasi berfungsi dengan benar, dan kemudian bersarang ifke -2 untuk melihat visibilitas UI ImageView saya juga berfungsi dengan benar.
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
pokerCardLarge = findViewById(R.id.pokerCardLgImageView);
if(pokerCardLarge.getVisibility() == pokerCardLarge.VISIBLE){
Bitmap image = ((BitmapDrawable)pokerCardLarge.getDrawable()).getBitmap();
pokerCardLarge.setVisibility(pokerCardLarge.VISIBLE);
pokerCardLarge.setImageBitmap(image);
}
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
pokerCardLarge = findViewById(R.id.pokerCardLgImageView);
if(pokerCardLarge.getVisibility() == pokerCardLarge.VISIBLE){
Bitmap image = ((BitmapDrawable)pokerCardLarge.getDrawable()).getBitmap();
pokerCardLarge.setVisibility(pokerCardLarge.VISIBLE);
pokerCardLarge.setImageBitmap(image);
}
}
}