W mojej aplikacji na Androida, kiedy obracam urządzenie (wysuwam klawiaturę), to mój Activity
restart jest uruchamiany ( onCreate
nazywany). Prawdopodobnie tak właśnie powinno być, ale wykonuję wiele wstępnych ustawień w onCreate
metodzie, więc potrzebuję:
- Umieść wszystkie ustawienia początkowe w innej funkcji, aby nie wszystkie zostały utracone podczas obracania urządzenia lub
- Spraw, aby tak
onCreate
się nie nazywało, a układ po prostu dostosowuje lub - Ogranicz aplikację do samego portretu, aby
onCreate
się nie nazywała.
android
rotation
android-activity
Isaac Waller
źródło
źródło
Odpowiedzi:
Korzystanie z klasy aplikacji
W zależności od tego, co robisz podczas inicjalizacji, możesz rozważyć utworzenie nowej klasy rozszerzającej
Application
i przeniesienie kodu inicjalizacji na przesłoniętąonCreate
metodę w tej klasie.Klasa
onCreate
w aplikacji jest wywoływana tylko wtedy, gdy tworzona jest cała aplikacja, więc działanie uruchamia się ponownie po zmianie orientacji lub zmiany widoczności klawiatury nie powodują jej uruchomienia.Dobrą praktyką jest ujawnianie wystąpienia tej klasy jako singletonu i ujawnianie zmiennych aplikacji, które inicjujesz za pomocą metod pobierających i ustawiających.
UWAGA: Musisz podać nazwę nowej klasy aplikacji w manifeście, aby mogła zostać zarejestrowana i użyta:
Reagowanie na zmiany konfiguracji [AKTUALIZACJA: jest to przestarzałe od API 13; zobacz zalecaną alternatywę ]
Jako kolejną alternatywę możesz poprosić aplikację o wykrywanie zdarzeń, które spowodowałyby ponowne uruchomienie - takie jak zmiany orientacji i widoczności klawiatury - i obsługę ich w ramach działania.
Zacznij od dodania
android:configChanges
węzła do manifestu Twojej aktywnościlub na Androida 3.2 (API poziom 13) i nowsze :
Następnie w ramach działania zastąp
onConfigurationChanged
metodę i wywołanie,setContentView
aby wymusić ponowne wykonanie układu GUI w nowej orientacji.źródło
android:configChanges
Należy unikać używania ( ) i używania jej tylko w ostateczności. Zapoznaj się z sekcją Obsługa zmian w środowisku wykonawczym, aby uzyskać więcej informacji o tym, jak poprawnie obsługiwać ponowne uruchomienie z powodu zmiany konfiguracji. Zamiast tego, aby utrwalić dane w zdarzeniach rotacyjnych, wydaje się, że wolą używaćonSaveInstanceState Bundle
; lub @ Jon-O wskazuje ,onRetainNonConfigurationInstance
.onRetainNonConfigurationChanges
jest bardziej odporne na uszkodzenia i proste.Aktualizacja dla Androida 3.2 i nowszych:
źródło
Fragments
isetRetainInstance
zamiast tego.screenSize
Android 3.2 i wyższy, który rozwiązał mój problem. Dziękuję!Zamiast próbować
onCreate()
całkowicie zwolnić odpalanie, może spróbuj sprawdzićBundle
savedInstanceState
, czy zdarzenie zostało przekazane do zdarzenia, aby sprawdzić, czy jest nieważne.Na przykład, jeśli mam jakąś logikę, która powinna być uruchomiona, gdy
Activity
jest naprawdę tworzona, a nie przy każdej zmianie orientacji, uruchamiam tę logikęonCreate()
tylko wtedy, gdysavedInstanceState
jest ona pusta.W przeciwnym razie nadal chcę, aby układ poprawnie przerysował odpowiednio do orientacji.
nie jestem pewien, czy jest to ostateczna odpowiedź, ale działa dla mnie.
źródło
Intent serverintent = new Intent(MainActivity.this, MessageListener.class);
istartService(serverintent);
stworzyćserverSocket = new ServerSocket(0xcff2);
iSocket client = serverSocket.accept();
zBufferedReader(new InputStreamReader(client.getInputStream()));
i może obracać się moja android i utrzymanie połączenia klient / serwer aktywny, jeszcze obracania GUI. Zgodnie z instrukcją, saveInstanceState zostaje zainicjowane po zamknięciu ostatniej aktywności.co ja zrobiłem...
w manifeście do sekcji aktywności dodano:
w kodzie działania zaimplementowano:
źródło
Opisujesz zachowanie domyślne. Musisz samodzielnie wykryć i obsłużyć te zdarzenia, dodając:
do manifestu, a następnie zmiany, które chcesz obsłużyć. Więc do orientacji użyłbyś:
a do otwierania lub zamykania klawiatury można użyć:
Jeśli chcesz obsłużyć oba, możesz po prostu je rozdzielić za pomocą polecenia potoku, takiego jak:
Spowoduje to wyzwolenie metody onConfigurationChanged w dowolnej wywoływanej czynności. Jeśli zastąpisz metodę, możesz przekazać nowe wartości.
Mam nadzieję że to pomoże.
źródło
Właśnie odkryłem tę wiedzę:
Aby utrzymać Aktywność przy życiu przez zmianę orientacji i obsłużyć ją
onConfigurationChanged
, dokumentacja i przykładowy kod powyżej sugerują to w pliku manifestu:co ma tę dodatkową zaletę, że zawsze działa.
Dodatkowa wiedza polega na tym, że pominięcie tego
keyboardHidden
może wydawać się logiczne, ale powoduje awarie w emulatorze (przynajmniej dla Androida 2.1): określenie tylkoorientation
spowoduje, że emulator będzie wywoływał zarówno,OnCreate
aonConfigurationChanged
czasem i tylkoOnCreate
raz.Nie widziałem awarii urządzenia, ale słyszałem o awarii emulatora dla innych. Warto więc to udokumentować.
źródło
Fragments
isetRetainInstance
zamiast tego.Możesz także rozważyć sposób utrwalania danych platformy Android w przypadku zmian orientacji:
onRetainNonConfigurationInstance()
igetLastNonConfigurationInstance()
.Umożliwia to utrwalanie danych podczas zmian konfiguracji, takich jak informacje uzyskane z pobierania z serwera lub czegoś innego, co zostało obliczone w przeszłości
onCreate
lub później, a także pozwala Androidowi zmienić układActivity
za pomocą pliku xml dla obecnie używanej orientacji .Zobacz tutaj lub tutaj .
Należy zauważyć, że metody te są obecnie przestarzałe (choć wciąż bardziej elastyczne niż obsługa orientacji zmieniają się, jak sugeruje większość powyższych rozwiązań), z zaleceniem, że wszyscy przełączają się
Fragments
i używająsetRetainInstance(true)
każdego z nich,Fragment
który chcesz zachować.źródło
Podejście to jest przydatne, ale jest niepełne, gdy używa się Fragmentów.
Fragmenty są zwykle odtwarzane po zmianie konfiguracji. Jeśli nie chcesz, aby tak się stało, użyj
setRetainInstance(true);
w konstruktorze (konstruktorach) fragmentuSpowoduje to zachowanie fragmentów podczas zmiany konfiguracji.
http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)
źródło
setRetainInstance()
metody @Abdo.Właśnie dodałem
w pliku manifestu i nie dodałem żadnej
onConfigurationChanged
metody do mojej aktywności.Dlatego za każdym razem, gdy klawiatura wysuwa się lub nic się nie dzieje .
źródło
<application ...android:configChanges="keyboard|keyboardHidden|orientation">
i działa. Moje ustawienia w build.gradle:minSdkVersion 15, compileSdkVersion 23, buildToolsVersion "23.0.2"
onCreate
Metoda nadal nazywa nawet jeśli zmienićorientation
Androida. Przeniesienie wszystkich ciężkich funkcji do tej metody nie pomożeźródło
Umieść poniższy kod w
<activity>
taguManifest.xml
:źródło
Która część manifestu mówi, że „nie dzwoń
onCreate()
”?Ponadto, Google Docs powiedzieć, aby uniknąć używania
android:configChanges
(z wyjątkiem w ostateczności) .... Ale wtedy alternatywne metody sugerują wszystkie DO wykorzystaniaandroid:configChanges
.Z mojego doświadczenia wynika, że emulator ZAWSZE wzywa
onCreate()
do rotacji.Ale 1-2 urządzenia, na których uruchamiam ten sam kod ... nie. (Nie jestem pewien, dlaczego miałaby istnieć różnica)
źródło
To bardzo proste, po prostu wykonaj następujące czynności:
To działa dla mnie:
Uwaga: orientacja zależy od wymagań
źródło
Zmiany, które należy wprowadzić w manifeście Androida:
Dodatki, które należy wprowadzić w ramach działania, to:
źródło
Dodaj tę linię do manifestu: -
i ten fragment do działania: -
źródło
Można to zrobić na kilka sposobów:
Zapisz stan aktywności
Możesz zapisać stan aktywności w
onSaveInstanceState
.a następnie użyj przycisku,
bundle
aby przywrócić stan.Obsługuj zmiany orientacji samodzielnie
Inną alternatywą jest samodzielne radzenie sobie ze zmianami orientacji. Ale nie jest to uważane za dobrą praktykę.
Dodaj to do pliku manifestu.
dla Androida 3.2 i nowszych:
Ogranicz rotację
Możesz także ograniczyć aktywność do trybu pionowego lub poziomego, aby uniknąć rotacji.
Dodaj to do tagu aktywności w pliku manifestu:
Lub zaimplementuj to programowo w swojej działalności:
źródło
Sposób, w jaki znalazłem to zrobić, użyj
onRestoreInstanceState
ionSaveInstanceState
zdarzeń, aby zapisać coś wBundle
(nawet jeśli dont potrzeba żadnych zmienne zapisane, wystarczy umieścić coś tam, więcBundle
nie jest pusta). Następnie wonCreate
metodzie sprawdź, czyBundle
jest pusty, a jeśli tak, to wykonaj inicjalizację, jeśli nie, to zrób to.źródło
Mimo że nie jest to „sposób na Androida”, osiągnąłem bardzo dobre wyniki, samodzielnie zajmując się zmianami orientacji i po prostu zmieniając położenie widżetów w widoku, aby uwzględnić zmienioną orientację. Jest to szybsze niż jakiekolwiek inne podejście, ponieważ twoich widoków nie trzeba zapisywać i przywracać. Zapewnia również bardziej płynne wrażenia dla użytkownika, ponieważ repozycjonowane widżety są dokładnie tymi samymi widżetami, po prostu przeniesione i / lub zmienione. W ten sposób można zachować nie tylko stan modelu, ale także stan widoku.
RelativeLayout
czasami może być dobrym wyborem dla widoku, który musi się od czasu do czasu zmieniać. Udostępniasz tylko zestaw parametrów układu pionowego i zestaw parametrów układu krajobrazowego, z różnymi względnymi regułami pozycjonowania dla każdego widżetu podrzędnego. Następnie w swojejonConfigurationChanged()
metodzie przekazujesz odpowiednią dosetLayoutParams()
wywołania każdego dziecka. Jeśli jakakolwiek kontrola dziecka musi zostać wewnętrznie zmieniona, wystarczy wywołać metodę na tym dziecku, aby wykonać zmianę orientacji. To dziecko podobnie wywołuje metody w swoich kontrolkach potomnych, które wymagają wewnętrznej zmiany orientacji i tak dalej.źródło
Za każdym razem, gdy ekran jest obracany, otwarte działanie jest zakończone, a funkcja onCreate () jest wywoływana ponownie.
1. Możesz zrobić jedną rzecz, aby zapisać stan aktywności, gdy ekran jest obrócony, dzięki czemu możesz odzyskać wszystkie stare rzeczy, gdy funkcja onCreate () aktywności zostanie ponownie wywołana. Zobacz to link
2) Jeśli chcesz zapobiec ponownemu uruchomieniu działania, po prostu umieść następujące wiersze w pliku manifest.xml.
źródło
musisz użyć metody onSavedInstanceState, aby zapisać całą wartość w parametrze to has is is bundle
I użyć
aby pobrać i ustawić wartość wyświetlania obiektów, obsłuży obrót ekranu
źródło
Uwaga: zamieszczam tę odpowiedź, jeśli ktoś w przyszłości napotka taki sam problem jak ja. Dla mnie następujący wiersz nie był wystarczający:
Kiedy obróciłem ekran, metoda `onConfigurationChanged (Configuration newConfig) nie została wywołana.
Rozwiązanie: Musiałem także dodać „screenSize”, nawet jeśli problem dotyczył orientacji. Więc w pliku AndroidManifest.xml dodaj to:
Następnie zaimplementuj metodę
onConfigurationChanged(Configuration newConfig)
źródło
W sekcji aktywności
manifest
dodaj:źródło
Dodaj ten wiersz w manifeście:
android:configChanges="orientation|screenSize"
źródło
Ludzie mówią, że powinieneś używać
Ale najlepszym i najbardziej profesjonalnym sposobem obsługi rotacji w Androidzie jest użycie klasy Loader. To nie jest słynna klasa (nie wiem dlaczego), ale jest o wiele lepsza niż AsyncTask. Aby uzyskać więcej informacji, możesz zapoznać się z samouczkami na temat Androida, które można znaleźć w kursach na temat Androida w Udacity.
Oczywiście w inny sposób można przechowywać wartości lub widoki za pomocą onSaveInstanceState i czytać je za pomocą onRestoreInstanceState. To naprawdę zależy od ciebie.
źródło
Po chwili prób i błędów znalazłem rozwiązanie, które odpowiada moim potrzebom w większości sytuacji. Oto kod:
Konfiguracja manifestu:
Główna aktywność:
I przykładowy fragment:
Można znaleźć na github .
źródło
Użyj
orientation
nasłuchiwania, aby wykonywać różne zadania o różnej orientacji.źródło
Umieścić to poniżej kod w swoim
Activity
INAndroid Manifest
.Nie spowoduje to ponownego uruchomienia aktywności po zmianie orientacji.
źródło
Napraw orientację ekranu (poziomą lub pionową) w
AndroidManifest.xml
android:screenOrientation="portrait"
lubandroid:screenOrientation="landscape"
w tym celu twoja
onResume()
metoda nie jest wywoływana.źródło
Jeden z najlepszych komponentów architektury Androida wprowadzony przez Google spełni wszystkie Twoje wymagania, jakim jest ViewModel.
Ma to na celu przechowywanie i zarządzanie danymi związanymi z interfejsem użytkownika w cyklu życia oraz pozwala na przetrwanie danych podczas obracania ekranu
Proszę odnieść się do tego: https://developer.android.com/topic/libraries/architecture/viewmodel
źródło
Możesz użyć obiektu ViewModel w swojej działalności.
Obiekty ViewModel są automatycznie zachowywane podczas zmian konfiguracji, dzięki czemu przechowywane przez nich dane są natychmiast dostępne dla następnego działania lub fragmentu. Czytaj więcej:
https://developer.android.com/topic/libraries/architecture/viewmodel
źródło