Bu, yukarıda belirtilmediği için bazı yeni geliştiricilerin kullanması durumunda. Sadece çok açık olmak gerekirse:
OnConfigurationChanged kullanıyorsanız iki şeye ihtiyacınız vardır :
onConfigurationChangedAktivite Sınıfınızdaki bir yöntem
Bildiriminizde , yönteminiz tarafından hangi yapılandırma değişikliklerinin ele alınacağını belirtinonConfigurationChanged
Yukarıdaki yanıtlardaki manifest snippet'i, manifestin ait olduğu belirli uygulama için doğru olsa da, Aktivite Sınıfınızdaki onConfigurationChanged yöntemini tetiklemek için bildiriminize tam olarak eklemeniz gereken şey DEĞİLDİR . ör. aşağıdaki manifest girişi uygulamanız için doğru olmayabilir.
<activity name= ".MainActivity" android:configChanges="orientation|screenSize"/>
Yukarıdaki bildirim girişinde, aşağıdakiler için çeşitli Android eylemleri vardır: android:configChanges="" Etkinlik yaşam döngünüzde onCreate'i tetikleyebilecek .
Bu çok önemlidir - Manifestte Belirtilmeyenler onConfigurationChangedonCreate'inizi tetikleyenlerdir ve manifestte belirtilenler Aktivite Sınıfınızdaki metodunuzu tetikleyenlerdir .
Bu nedenle, hangi yapılandırma değişikliklerini kendiniz halletmeniz gerektiğini belirlemeniz gerekir. Benim gibi Ansiklopedik Olarak Meydan Okuyan Android için, Android Studio'daki hızlı ipuçlarını kullandım ve hemen hemen her olası yapılandırma seçeneğine ekledim. Bunların hepsini listelemek temelde her şeyi halledeceğimi ve onCreate'in yapılandırmalar nedeniyle asla çağrılmayacağını söyledi.
<activity name= ".MainActivity" android:configChanges="screenLayout|touchscreen|mnc|mcc|density|uiMode|fontScale|orientation|keyboard|layoutDirection|locale|navigation|smallestScreenSize|keyboardHidden|colorMode|screenSize"/>
Açıkçası her şeyi halletmek istemiyorum, bu yüzden yukarıdaki seçenekleri teker teker kaldırmaya başladım. Her kaldırma işleminden sonra uygulamamı yeniden oluşturma ve test etme.
Bir başka önemli nokta : onCreate'inizi tetikleyen otomatik olarak işlenen tek bir yapılandırma seçeneği varsa (yukarıdaki bildiriminizde listelenmemişse), o zaman şu şekilde görünecektir:onConfigurationChanged çalışmıyor . Tüm ilgili olanları manifestinize koymalısınız.
Başlangıçta onCreate'i tetikleyen 3 ile bitirdim, sonra bir S10 + üzerinde test ettim ve hala onCreate'i alıyordum, bu yüzden eleme egzersizimi tekrar yapmak zorunda kaldım ve ayrıca |screenSize. Bu nedenle, çeşitli platformlarda test edin.
<activity name= ".MainActivity" android:configChanges="screenLayout|uiMode|orientation|screenSize"/>
Öyleyse benim önerim, eminim ki birisi bunda delikler açabilir:
onConfigurationChangedMetodunuzu bir TOAST veya LOG ile Aktivite Sınıfınıza ekleyin, böylece ne zaman çalıştığını görebilirsiniz.
Bildiriminize tüm olası yapılandırma seçeneklerini ekleyin.
onConfigurationChangedUygulamanızı test ederek yönteminizin çalıştığını doğrulayın .
Her yapılandırma seçeneğini manifest dosyanızdan teker teker kaldırın ve uygulamanızı her seferinde test edin.
Mümkün olduğunca çok çeşitli cihazlarda test edin.
Yukarıdaki snippet'imi manifest dosyanıza kopyalamayın / yapıştırmayın. Android güncellemeleri listeyi değiştirir, bu nedenle hepsini aldığınızdan emin olmak için açılır Android Studio ipuçlarını kullanın.
Umarım bu birisine biraz zaman kazandırır.
Benim onConfigurationChangedhemen altında bilgi için yöntem. yeni yönlendirme mevcut olduktan sonra , ancak kullanıcı arayüzü yeniden oluşturulmadan önceonConfigurationChanged yaşam döngüsünde çağrılır . Bu nedenle , yönlendirmeyi ilk kontrol eden benim doğru çalışıyor ve ardından UI ImageView'umun görünürlüğüne bakmak için iç içe geçmiş 2 de doğru çalışıyor.ifif
@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);
}
}
}