Właśnie zaimplementowałem funkcję zmiany orientacji - np. Gdy układ zmienia się z pionowego na poziomy (lub odwrotnie). Jak mogę wykryć zakończenie zdarzenia zmiany orientacji.
OrientationEventListener
Nie działa. Jak mogę otrzymywać powiadomienia o zdarzeniach dotyczących zmiany orientacji układu?
Odpowiedzi:
Użyj metody onConfigurationChanged Activity. Zobacz poniższy kod:
Musisz także edytować odpowiedni plik element w pliku manifestu, aby uwzględnić android: configChanges Wystarczy spojrzeć na poniższy kod:
UWAGA: w systemie Android 3.2 (poziom API 13) lub nowszym „rozmiar ekranu” zmienia się również, gdy urządzenie przełącza się między orientacją pionową i poziomą. Dlatego jeśli chcesz zapobiec ponownemu uruchamianiu środowiska uruchomieniowego z powodu zmiany orientacji podczas programowania na poziomie interfejsu API 13 lub wyższym, musisz zadeklarować android: configChanges = "orientacja | screenSize" dla interfejsu API na poziomie 13 lub wyższym .
Mam nadzieję, że to ci pomoże ... :)
źródło
Do ładowania układu w układ-lądowych załamującej masz dwa oddzielne układy potem trzeba zrobić
setContentView
wonConfigurationChanged
metodzie.Jeśli masz tylko jeden układ, nie ma potrzeby tworzenia setContentView w tej metodzie. po prostu
źródło
onConfigurationChanged(Configuration newConfig)
metodę (jak w tej odpowiedzi), ale zamiast obsługiwać ją samodzielnie, ustawiłem flagę logiczną, a następnie wywołałemrecreate()
metodę, aby Android odtworzył aktywność w normalny sposób.recreate()
metodą jest to, że powoduje ona krótkie miganie ekranu na czarno. Z tego powodu zastosowałem inne podejście: (1) zapisz szerokość ekranu wonCreate(...)
, (2) porównaj zapisaną szerokość ekranu z aktualną szerokością ekranu w dowolnej metodzie cyklu życia, gdy aktywność jest kończona (nponSaveInstanceState(...)
.).Chciałem tylko pokazać, jak zapisać cały pakiet po onConfigurationChanged:
Utwórz nowy pakiet zaraz po zajęciach:
Następnie po „protected void onCreate” dodaj to:
Jeśli dodasz to, wszystkie twoje klasy ze skrzynek do MainActivity zostaną zapisane.
Najlepszym sposobem jest jednak dodanie tego do pliku AndroidManifest:
źródło
onConfigurationChanged()
sprawia, że instancja instanceState nie jest niszczona po zmianie orientacji, więc nie musisz jej zapisywać. Możesz chcieć zapisać go dla innych wydarzeń w cyklu życia działania, ale nie wiem.użyj tej metody
I nie zapomnij dodać tego w swoim Androidmainfest.xml
lubię to
źródło
Zastąp metodę działania onConfigurationChanged
źródło
Chcę tylko zaproponować inną alternatywę, która rzeczywiście będzie dotyczyła niektórych z was, jak wyjaśniono powyżej:
oznacza, że jawnie deklarujemy układ do wstrzyknięcia.
W przypadku, gdy chcemy zachować automatyczne wtryskiwanie dzięki układowi terenu i folderom układu. Wszystko, co musisz zrobić, to dodać go do onCreate:
Tutaj wyświetlamy lub nie pasek akcji w zależności od orientacji telefonu
źródło
Utwórz instancję
OrientationEventListener
klasy i włącz ją.źródło
Jeśli zaakceptowana odpowiedź nie działa dla Ciebie, upewnij się, że nie zdefiniowałeś w pliku manifestu:
Tak jest w moim przypadku.
źródło
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 :
onConfigurationChanged
Metoda w klasie ActivityOkreśl w swoim manifeście, które zmiany konfiguracji będą obsługiwane przez Twoją
onConfigurationChanged
metodę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.
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ą
onConfigurationChanged
metodę 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.
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
onConfigurationChanged
nie 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.Więc moja sugestia, chociaż jestem pewien, że ktoś może w tym dziurawić:
Dodaj swoją
onConfigurationChanged
metodę 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
onConfigurationChanged
metoda 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
onConfigurationChanged
metoda tylko dla informacji poniżej.onConfigurationChanged
jest wywoływana w cyklu życia po udostępnieniu nowej orientacji, ale przed odtworzeniem interfejsu użytkownika. Dlatego mój pierwszy,if
aby sprawdzić, czy orientacja działa poprawnie, a następnie drugi zagnieżdżony,if
aby spojrzeć na widoczność mojego UI ImageView, również działa poprawnie.źródło
dla implementacji Kotilin w najprostszej formie - uruchamia się tylko wtedy, gdy ekran zmienia się z pionowego <--> poziomego w razie potrzeby urządzenie wykrywanie odwrócenia (180 stopni) musisz przejść do wartości czujnika grawitacji
źródło