W przypadku, gdy jest to przydatne dla niektórych nowszych programistów, ponieważ nie zostało to określone powyżej. Żeby być bardzo wyraźnym:
Jeśli używasz onConfigurationChanged, potrzebujesz dwóch rzeczy :
onConfigurationChangedMetoda w klasie Activity
Określ w swoim manifeście, które zmiany konfiguracji będą obsługiwane przez Twoją onConfigurationChangedmetodę
Fragment manifestu w powyższych odpowiedziach, choć bez wątpienia poprawny dla konkretnej aplikacji, do której należy manifest, NIE jest dokładnie tym, co musisz dodać w swoim manifeście, aby wywołać metodę onConfigurationChanged w swojej klasie działania. tzn. poniższy wpis manifestu może nie być poprawny dla Twojej aplikacji.
<activity name= ".MainActivity" android:configChanges="orientation|screenSize"/>
W powyższym manifeście znajdują się różne akcje systemu Android, android:configChanges=""które mogą wywołać onCreate w cyklu życia działania.
To jest bardzo ważne - te, które NIE zostały określone w manifeście, to te, które wyzwalają twoją onCreate, a te określone w manifeście to te, które wyzwalają twoją onConfigurationChangedmetodę w twojej klasie aktywności.
Musisz więc określić, które zmiany w konfiguracji musisz wykonać samodzielnie. W przypadku Android Encyclopedically Challenged, takiego jak ja, użyłem szybkich podpowiedzi w Android Studio i dodałem prawie każdą możliwą opcję konfiguracji. Wymienienie wszystkich z nich w zasadzie mówiło, że poradzę sobie ze wszystkim, a onCreate nigdy nie zostanie wywołany z powodu konfiguracji.
<activity name= ".MainActivity" android:configChanges="screenLayout|touchscreen|mnc|mcc|density|uiMode|fontScale|orientation|keyboard|layoutDirection|locale|navigation|smallestScreenSize|keyboardHidden|colorMode|screenSize"/>
Teraz oczywiście nie chcę zajmować się wszystkim, więc zacząłem eliminować powyższe opcje pojedynczo. Ponowne kompilowanie i testowanie mojej aplikacji po każdym usunięciu.
Kolejna ważna kwestia : jeśli tylko jedna opcja konfiguracji jest obsługiwana automatycznie, która uruchamia twoje onCreate (nie masz jej na liście powyżej w swoim manifeście), wtedy będzie wyglądać tak, jakby onConfigurationChangednie działała. Musisz umieścić wszystkie istotne w swoim manifeście.
Skończyło się na 3, które początkowo wyzwalały onCreate, potem testowałem na S10 + i nadal otrzymywałem onCreate, więc musiałem ponownie wykonać ćwiczenie eliminacyjne i potrzebowałem również |screenSize. Przetestuj więc na wybranych platformach.
<activity name= ".MainActivity" android:configChanges="screenLayout|uiMode|orientation|screenSize"/>
Więc moja sugestia, chociaż jestem pewien, że ktoś może w tym dziurawić:
Dodaj swoją onConfigurationChangedmetodę do swojej klasy aktywności z TOASTEM lub LOGIEM, aby zobaczyć, kiedy działa.
Dodaj wszystkie możliwe opcje konfiguracji do swojego manifestu.
Sprawdź, czy Twoja onConfigurationChangedmetoda działa, testując aplikację.
Usuń każdą opcję konfiguracji z pliku manifestu pojedynczo, testując aplikację po każdej.
Testuj na jak największej liczbie różnych urządzeń.
Nie kopiuj ani nie wklejaj powyższego fragmentu do swojego pliku manifestu. Aktualizacje Androida zmieniają listę, więc skorzystaj z wyskakujących wskazówek Android Studio, aby upewnić się, że masz je wszystkie.
Mam nadzieję, że to komuś zaoszczędzi trochę czasu.
Moja onConfigurationChangedmetoda tylko dla informacji poniżej. onConfigurationChangedjest wywoływana w cyklu życia po udostępnieniu nowej orientacji, ale przed odtworzeniem interfejsu użytkownika. Dlatego mój pierwszy, ifaby sprawdzić, czy orientacja działa poprawnie, a następnie drugi zagnieżdżony, ifaby spojrzeć na widoczność mojego UI ImageView, również działa poprawnie.
@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);
}
}
}