onConfigurationChanged nie jest wywoływany

141

Dziś rano wpadłem na problem, próbując poradzić sobie z tym onConfigurationChangedwydarzeniem. Problem w tym, że metoda, którą nadpisuję, nie jest wywoływana przy zmianie orientacji telefonu. W ogóle mnie nie wezwano.

Ustawiłem android:configChanges="orientation"aktywność zdefiniowaną w manifeście, jak wspomniano w dokumentacji Androida, ale to nie robi różnicy.

Czy wpadłeś na ten problem?

lblasa
źródło
1
Mam ten sam problem dla Androida: configChanges = "keyboardHidden" - onConfigurationChanged nie jest wywoływany, gdy miękka klawiatura wsuwa się lub wysuwa.
Pieter Witvoet
keyboardHidden nie jest wyzwalany przez klawiaturę programową, tylko przez klawiatury sprzętowe, takie jak wysuwana klawiatura w Droidzie.
NMR
10
Powinieneś dodać „screenSize” w android:configChanges Tak powiedział Google javadoc: Note: If your application targets API level 13 or higher (as declared by the minSdkVersion and targetSdkVersion attributes), then you should also declare the "screenSize" configuration, because it also changes when a device switches between portrait and landscape orientations.
Ektos974
@ Ektos974 świetnie! dodanie funkcji screenSize wywołuje onConfigurationChanged!
Manuela,
Cześć, używam motywu Theme.Holo.Light.NoActionBar. W tym przypadku moja aktywność jest ponownie uruchamiana. Czy istnieje sposób, aby uniknąć ponownego uruchomienia aktywności?
Manukumar

Odpowiedzi:

250

To był mój gremlin z powodu tego samego problemu:

Uwaga: począwszy od Androida 3.2 (poziom interfejsu API 13) „rozmiar ekranu” zmienia się również, gdy urządzenie przełącza się między orientacją pionową i poziomą. Dlatego jeśli chcesz zapobiec ponownym uruchomieniom środowiska wykonawczego z powodu zmiany orientacji podczas programowania interfejsu API na poziomie 13 lub wyższym (zgodnie z deklaracjami atrybutów minSdkVersion i targetSdkVersion), oprócz wartości „orientacja” należy dołączyć wartość „screenSize”. Oznacza to, że musisz zdekalować androida: configChanges = "orientacja | rozmiar ekranu". Jeśli jednak aplikacja jest przeznaczona dla interfejsu API na poziomie 12 lub niższym, aktywność zawsze sama obsługuje tę zmianę konfiguracji (ta zmiana konfiguracji nie powoduje ponownego uruchomienia działania, nawet w przypadku uruchamiania na urządzeniu z systemem Android 3.2 lub nowszym).

(Od http://developer.android.com/guide/topics/resources/runtime-changes.html )

TL; DR: dodaj „| screenSize” do configChanges w przypadku kierowania na poziom interfejsu API 13+

nmr
źródło
9
wow, tylko jeden atrybut do dodania i do cholery to wszystko, +1z mojej strony "screenSize"to było.
Anuj,
@philipp Co dałoby ustawienie orientacji czujnika? Nie wiem, jak to byłoby pomocne. Dzięki za zmianę.
NMR
4 lata później ludzie wciąż się tym pogryzają :)
Daniel Wilson
Dzięki. Spędziłem 30 minut uderzając głową o ścianę.
Lagos
To idealne rozwiązanie
Anbarasu Chinna,
40

Niektóre urządzenia w wersji 4.0 nie wywołują onConfigurationChanged. Po prostu dodaj słuchacza do screenSize.

android:configChanges="orientation|screenSize"
Corbella
źródło
To rozwiązało mój problem. Zastępowanie onConfigurationChanged, testowanie przeciw Configuration.ORIENTATION_LANDSCAPEi umieszczanie TYLKO android:configChanges="orientation"w manifeście nie wystarczyło w przypadku mojego tabletu Nexus 7. Dzięki
Jantzilla,
37

Problem polegał na tym, że jeśli używasz tej metody

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

aby wymusić orientację Activityna tryb portretowy, nie jesteś kandydatem do otrzymywania orientationzmian.

Więc rozwiązaniem jest nie setRequestOrientationdo określonego trybu. Ale zamiast tego użyjSCREEN_ORIENTATION_SENSOR.

lblasa
źródło
5
tak, to działa, ale co jeśli nie chcę, aby moja aplikacja była obracana? chcę, żeby pozostało w trybie poziomym.
stoefln
musisz określić <activity android: name = ". MyActivity" android: screenOrientation = "landscape"> </activity> w swoim pliku menifest
Qadir Hussain
3
Jak z tego korzystać (gdy użytkownik kliknie „pełny ekran” w odtwarzaczu wideo) ORAZ nadal odbierać onConfigChanged, gdy użytkownik obraca telefon. Takie samo zachowanie jak w aplikacji YouTube. To możliwe?
Vucko,
29

sprawdź, czy Twoje urządzenie ma włączone ustawienie „Obracanie ekranu”

Ustawienie „Obrót ekranu”

Dmitrij Kolesnikowicz
źródło
7
Miałem taki zabawny numer ...: D
Dharmendra
Czy można obrócić aktywność, mimo że opcja „Obrót ekranu” jest WYŁĄCZONA ?. Jeśli TAK, powiedz mi, jak to zrobić ......? Zgodnie z moim rozumieniem to nie zadziała, ale niektóre aplikacje zmieniają działanie na krajobraz.
Srinivasan
1
S ** t !!! Spędziłem 4-5 godzin, próbując zmusić mój kod do działania! Sposobem na obejście tego, jak dowiaduję się z innej odpowiedzi, jest włączenie <android: orientacja = "sensor"> do manifestu
suku
19
  1. Sprawdź, czy nie używasz android:screenOrientationw sposób Activitylub w Applicationpoziomie.
  2. Spróbuj użyć android:configChanges="orientation|keyboardHidden"zamiast tego.
Macarse
źródło
1
jak mogę korzystać z androida: screenOrientation i chcę onConfigurationChanged method run, co mogę zrobić, thx
Bingchean
17

Spędziłem dziesiątki minut, aby dowiedzieć się, dlaczego to nie działa. Dodałem, screenSizeale nadal nie działało.

Okazało się, że dodałem android:configChangesdo <application>elementu, a nie do <activity>elementu tak, jak powinienem!

Cóż, oczywiście to był mój błąd, ale wszyscy wiemy, że każdy z nas spędza dużo czasu na tego rodzaju głupich błędach. Tak więc dodaję tę odpowiedź na wypadek, gdyby pojawił się inny głupi programista taki jak ja.

Cholerne warzywa
źródło
Robię to samo, dzięki, że mnie uratowałeś
Pranoy Sarkar
Dzięki stary!
Laurent
14

Macarse ma 100% pieniędzy z drugą opcją.

Próbować android:configChanges="orientation|keyboardHidden|screenSize"

Miałem dokładnie ten sam problem i na emulatorze 1.6 dodawanie keyboardHiddenprzyczyn onConfigurationChangeddo wywołania podczas rotacji. Usuń go, a przestanie być wywoływany.

William
źródło
5

Miałem ten sam problem - onConfigurationChangednie został wywołany, gdy urządzenie zmieniło orientację pomimo posiadania android:configChanges="orientation|keyboardHidden"w pliku manifestu. Użyłem fragmentu kodu udostępnionego Devatutaj

orientacja nie działa w 2.3.3?

aby sprawdzić, czy ktoś onConfigurationChangeddzwoni. Nie było.

Po kilku godzinach eksperymentowania zdałem sobie sprawę, że mam następujące wiersze w pliku manifestu

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15"/>

i po zmianie android:targetSdkVersion="15"na android:targetSdkVersion="8", onConfigurationChangedzaczął być nazywany. Tak więc część manifestu w końcu wyglądała tak

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="8"/>
aLearner
źródło
9
Problem, który masz, to brakujący atrybut: rozmiar ekranu. Zaktualizuj swoją odpowiedź. To będzie myląca „poprawka” dla początkujących programistów andriod
Tobrun
@ user1281750 Dzięki, ale jako początkujący programista Android sam nie jestem pewien, co dokładnie mówisz.
aLearner
@aLearner Myślę, że user1281750 miał na myśli: to nie jest poprawka! A co jeśli potrzebujesz wyższej wersji SDK?
AgentKnopf,
Podzieliłem się tym, co działało dla mnie. Zdaję sobie sprawę, że może to nie być „rozwiązanie”. Ale jaka jest alternatywa? Jakie jest „właściwe” rozwiązanie? A co oznacza „brakujący attribute: screensize”? Może być pomocne, jeśli podasz więcej szczegółów.
aLearner
Dzięki kolego, to rozwiązanie rozwiązało moje wielkie napięcie lol .. Surfowałem przez godzinę, aby to uzyskać ... działa również we wszystkich zaktualizowanych wersjach
Sampath Kumar.
3

Właśnie odkryłem, że jeśli masz:

android:screenOrientation="landscape"

w manifeście onConfigurationChanged () również nie zostanie wywołana ...

może to być podobne do:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

to ustawienie orientacji blokuje onConfigurationChanged ().

Nick Jian
źródło
3
<uses-sdk android:minSdkVersion="8" android:maxSdkVersion="17" />

Nie używaj żadnych docelowych wersji SDK, aby komplikować. i dla wszystkich poziomów interfejsu API użyj tego jako nasłuchiwania zmian konfiguracji

android:configChanges="orientation|keyboardHidden|screenLayout"
Sampath Kumar
źródło
3

Nie jestem pewien, czy to najlepsze miejsce do tego, ale napotykając ten problem - zauważyłem coś ciekawego.

Jeśli detektor onConfigurationChanged () NIE działa, to onCreate () jest wywoływana ponownie przy każdej zmianie orientacji.

Jeśli detektor onConfigurationChanged () działa, to ta metoda jest wywoływana zamiast onCreate () w przypadku zmiany orientacji.

Gene Bo
źródło
Oto, co widzę - ale nie chcę. I według doktorów nie powinno się to dziać w ten sposób. Takie mylące.
slycrel
2

Nie wszystkie rozwiązania działają, ale próbuję usunąć aktywność związaną z motywem w pliku manifestu systemu Android. Bardzo dziwne

<activity
        android:name="MyActivity"
        android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
        android:theme="@style/MyTheme" --> remove this line
        />



<style name="MyTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="windowNoTitle">true</item>
    <item name="android:windowIsTranslucent">true</item>
</style>
thanhbinh84
źródło
Czy jest jakiś sposób, aby uniknąć ponownego uruchomienia działania bez usuwania windowNoTitle?
Manukumar
2

Żadna z sugestii nie zadziałała dla mnie (zareagowałem na projekt natywny z tym problemem), ale po godzinach debugowania stwierdziłem, że jeśli masz tę linię w AppTheme of styles.xml

<item name="android:windowIsTranslucent">true</item>

aplikacja nie będzie się obracać.

Matej Ukmar
źródło
1

@ thanhbinh84 Dał mi pomysł, co może być tego przyczyną.
Usunięcie <item name="android:windowIsTranslucent">true</item> z mojego motywu w styles.xml naprawiło to!

Nitsan
źródło
0

Wystąpił ten sam problem i w manifeście określono zarówno „android: screenOrientation”, jak i „android: configChanges”. Kiedy usunąłem pierwszy, onConfigurationChanged () został wywołany podczas rotacji. Dziwne, ale wkurza)

Mieszać
źródło
1
Ale jak wtedy się obracasz?
Mark Molina,
-2

Czy masz android.content.res.Configurationw swoich zestawieniach importowych? Eclipse może automatycznie wstawiać importy po naciśnięciu Ctrl+Shift+O.

Jeśli tego nie ma, kompilator nie będzie w stanie rozpoznać, że zasadnie zastępujesz metodę nadklasy, a zatem zgłosi błąd.

Mark Mooibroek
źródło
Tak, import jest już na miejscu, jakieś pomysły? ponieważ nie otrzymuję żadnego błędu ani nic, po prostu nie jestem wzywany.
lblasa
Nie wiem, czy może to mieć związek z tym, że cała aplikacja jest wykonana w trybie portretowym. Działanie, w którym muszę obsłużyć onConfigurationChangedEvent jest działaniem zawartym w TabHost, którego tryb jest portretowy. Ale w każdym razie nie znalazłem żadnych komentarzy, które mogłyby stanowić problem przy przechwytywaniu tego wydarzenia. Naprawdę nie mam pomysłów.
lblasa