onConfigurationChanged non viene chiamato


141

Questa mattina ho riscontrato un problema nel tentativo di gestire l' onConfigurationChangedevento. Il problema è che il metodo, che ignoro, non viene chiamato quando cambio l'orientamento del telefono. Non essere chiamato affatto.

Ho inserito android:configChanges="orientation"l'attività definita nel manifest come menzionato nella documentazione di Android, ma questo non fa differenza.

Hai trovato questo problema?


1
Sto riscontrando lo stesso problema per Android: configChanges = "keyboardHidden" - onConfigurationChanged non viene chiamato quando la tastiera software scorre dentro o fuori.
Pieter Witvoet,

keyboardHidden non viene attivato dalla tastiera del software, ma solo dalle tastiere hardware, come la tastiera scorrevole sul Droid.
nmr

10
Dovresti aggiungere "screenSize" in android:configChanges Questo è ciò che ha detto il 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 great! aggiungendo screenSize viene chiamata onConfigurationChanged!
Manuela,

Ciao, sto usando il tema Theme.Holo.Light.NoActionBar. Per questo, la mia attività si riavvia. C'è un modo per evitare l'attività per ottenere il riavvio?
Manukumar,

Risposte:


250

Questo è stato il mio gremlin per lo stesso problema:

Attenzione: a partire da Android 3.2 (livello API 13), la "dimensione dello schermo" cambia anche quando il dispositivo passa dall'orientamento verticale a quello orizzontale. Pertanto, se si desidera impedire il riavvio del runtime a causa della modifica dell'orientamento durante lo sviluppo per livello API 13 o superiore (come dichiarato dagli attributi minSdkVersion e targetSdkVersion), è necessario includere il valore "screenSize" oltre al valore "orientamento". Cioè, devi decalare android: configChanges = "orientamento | screenSize". Tuttavia, se l'applicazione ha come target API livello 12 o inferiore, la tua attività gestisce sempre questa modifica della configurazione stessa (questa modifica della configurazione non riavvia la tua attività, anche quando è in esecuzione su un dispositivo Android 3.2 o versione successiva).

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

TL; DR: aggiungi "| screenSize" a configChanges quando scegli come target API livello 13+


9
wow, solo un singolo attributo da aggiungere e dannazione è tutto, +1dalla mia parte "screenSize"lo era.
Anuj,

@philipp Cosa raggiungerebbe l'orientamento del sensore? Non sono sicuro di come sarebbe utile. Grazie per la modifica però.
nmr

4 anni dopo la gente viene ancora morsa da questo :)
Daniel Wilson,

Grazie. Ho passato 30 minuti a colpire la mia testa contro il muro.
Lagos,

Questa è la soluzione perfetta
Anbarasu Chinna il

40

Alcuni dispositivi di 4.0 non chiamano onConfigurationChanged. Aggiungi un ascoltatore anche a screenSize.

android:configChanges="orientation|screenSize"

Questo ha risolto il mio problema. Ignorare onConfigurationChanged, testare Configuration.ORIENTATION_LANDSCAPEe includere SOLO android:configChanges="orientation"nel manifest non era sufficiente per il mio tablet Nexus 7. Grazie
Jantzilla,

37

Il problema era che se si utilizza questo metodo

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

per forzare l'orientamento della Activitymodalità verticale, non sei candidato a ricevere le orientationmodifiche.

Quindi la soluzione è non quella setRequestOrientationdi una modalità particolare. Ma invece usaSCREEN_ORIENTATION_SENSOR.


5
sì, funziona, ma cosa succede se non voglio che la mia app venga ruotata? voglio che rimanga in modalità orizzontale.
Stoefln,

devi specificare <attività android: name = ". MyActivity" android: screenOrientation = "landscape"> </activity> nel tuo file manifest
Qadir Hussain,

3
Come posso utilizzare entrambi (quando l'utente fa clic su "schermo intero" su un lettore video) E continuare a ricevere onConfigChangedanche quando l'utente ruota il suo telefono. Stesso comportamento dell'app di YouTube. Questo possibile?
Vucko,

29

verifica che il tuo dispositivo abbia l'impostazione "Rotazione schermo" attivata

Impostazione "Rotazione schermo"


7
Ho avuto questo divertente problema ...: D
Dharmendra,

È possibile ruotare l'attività anche se l'opzione "Rotazione schermo" è OFF ?. Se SÌ, per favore dimmi come farlo ......? Secondo me, la mia comprensione non funzionerà ma alcune applicazioni ruotano l'attività in orizzontale.
Srinivasan,

1
S ** t !!! Ho trascorso 4-5 ore a cercare di far funzionare il mio codice! Un modo per ignorare questo, mentre imparo da un'altra risposta è includere <android: orientamento = "sensore"> nel manifest
suku,

19
  1. Verificare che non si stia utilizzando android:screenOrientationin Activityo in un Applicationlivello.
  2. Prova ad usare android:configChanges="orientation|keyboardHidden"invece.

1
come posso usare android: screenOrientation e voglio onConfigurationChanged metodo eseguito, cosa posso fare, grazie
Bingchean

17

Ho impiegato decine di minuti per scoprire perché non funzionava. Ho aggiunto screenSizema ancora non ha funzionato.

Si è scoperto che avevo aggiunto android:configChangesal <application>elemento, non al <activity>elemento come avrei dovuto!

Bene, ovviamente, questo è stato il mio errore, ma sappiamo tutti che tutti noi trascorriamo molto tempo per questo tipo di errore sciocco. Quindi, sto aggiungendo questa risposta nel caso in cui ci dovrebbe essere un altro programmatore sciocco come me.


Sto anche facendo lo stesso, grazie mi hai salvato
Pranoy Sarkar,

Grazie amico!
Laurent,

14

Macarse è al 100% in denaro con la sua seconda opzione.

Provare android:configChanges="orientation|keyboardHidden|screenSize"

Ho avuto esattamente lo stesso problema e sull'emulatore 1.6 l'aggiunta di keyboardHiddencause onConfigurationChangedda chiamare durante la rotazione. Rimuovilo e smette di essere chiamato.


5

Ho avuto lo stesso problema: onConfigurationChangednon è stato chiamato quando il dispositivo ha cambiato orientamento nonostante fosse presente android:configChanges="orientation|keyboardHidden"nel file manifest. Ho usato il frammento di codice condiviso da Devaqui

l'orientamento non funziona in 2.3.3?

per verificare se onConfigurationChangedveniva chiamato. Non era.

Dopo alcune ore di sperimentazione, mi sono reso conto di avere le seguenti righe nel file manifest

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

e sulla modifica android:targetSdkVersion="15"al android:targetSdkVersion="8", onConfigurationChangediniziato ad essere chiamato. Quindi, parte del manifest finalmente sembrava così

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

9
Il problema che stai riscontrando è l'attributo mancante: screensize. Aggiorna la tua risposta. Questa sarà una "correzione" fuorviante per gli sviluppatori andriod di inizio
Tobrun,

@ user1281750 Grazie ma io stesso come sviluppatore Android non sono sicuro di cosa stia esattamente dicendo.
aLearner

@aLearner Penso che cosa significasse user1281750: in realtà non è una soluzione! Cosa succede se hai bisogno di una versione di sdk superiore?
AgentKnopf,

Ho condiviso ciò che ha funzionato per me. Mi rendo conto che questa potrebbe non essere la 'soluzione'. Ma qual è l'alternativa? Qual è la soluzione "giusta"? E cosa si intende per "mancante attribute: screensize"? Potrebbe essere utile se vengono forniti ulteriori dettagli.
aLearner

Grazie amico questa soluzione ha risolto la mia grande tensione lol .. Stavo navigando per un'ora per ottenere questo ... funziona anche in tutte le versioni aggiornate
Sampath Kumar

3

Ho appena scoperto che se hai:

android:screenOrientation="landscape"

nel manifest, onConfigurationChanged () non verrà chiamato troppo ...

questo può essere simile a:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

quell'orientamento delle impostazioni blocca onConfigurationChanged ().


3
<uses-sdk android:minSdkVersion="8" android:maxSdkVersion="17" />

Non utilizzare versioni di sdk di destinazione per complicarti. e per tutti i livelli API utilizzare questo come listener di modifica della configurazione

android:configChanges="orientation|keyboardHidden|screenLayout"

3

Non sono sicuro che questo sia il posto migliore, ma nell'affrontare questo problema - ho osservato qualcosa di interessante.

Se il listener onConfigurationChanged () NON funziona, allora onCreate () viene chiamato di nuovo ogni volta che si cambia l'orientamento.

Se il listener onConfigurationChanged () funziona, quel metodo viene chiamato invece di onCreate () quando l'orientamento cambia.


Questo è quello che sto vedendo, ma non voglio essere. E secondo i documenti non dovrebbe accadere in questo modo. Così confuso.
slycrel,

2

Tutte le soluzioni non funzionano quando provo a rimuovere l'attività del tema nel file manifest di Android. Così strano

<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>

È possibile evitare il riavvio dell'attività senza rimuovere windowNoTitle?
Manukumar,

2

Nessuno dei suggerimenti ha funzionato per me (ho avuto un progetto nativo reattivo con questo problema), ma dopo ore di debug ho scoperto che se hai questa linea in AppTheme of styles.xml

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

quindi l'app non ruoterà.


1

@ thanhbinh84 Mi ha dato un'idea di cosa potrebbe causare questo.
La rimozione <item name="android:windowIsTranslucent">true</item> dal mio tema in styles.xml lo ha risolto!


0

Ho avuto lo stesso problema e avevo sia "android: screenOrientation" che "android: configChanges" specificati in manifest. Quando l'ho rimosso per primo, onConfigurationChanged () viene chiamato in rotazione. Strano ma si sveglia)


1
Ma come si fa a ruotare allora?
Mark Molina,

-2

Hai android.content.res.Configurationdelle dichiarazioni di importazione? Eclipse può inserire le importazioni automaticamente se si preme Ctrl+Shift+O.

Se manca, il compilatore non sarà in grado di riconoscere che stai legittimamente sovrascrivendo il metodo superclass e quindi genererà un errore.


Sì, l'importazione è già in atto, qualche idea? perché non ricevo alcun errore o altro, è solo che non viene chiamato.
lblasa,

Non so se questo potrebbe essere correlato al fatto che tutte le applicazioni sono state realizzate in modalità verticale. L'attività in cui devo gestire onConfigurationChangedEvent è un'attività contenuta in un TabHost quale modalità è verticale. Ma comunque, non ho trovato alcun commento di questo come un problema per la cattura di quell'evento. Sono davvero senza idee.
lblasa,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.