onConfigurationChanged no se llama

141

Esta mañana se me ocurrió un problema al tratar de manejar el onConfigurationChangedevento. El problema es que el método, que anulo, no se llama cuando cambio la orientación del teléfono. No me llaman en absoluto.

Puse android:configChanges="orientation"la actividad definida en el manifiesto como se menciona en la documentación de Android, pero esto no hace la diferencia.

¿Se te ocurrió este problema?

lblasa
fuente
1
Tengo el mismo problema para Android: configChanges = "keyboardHidden" - onConfigurationChanged no recibe una llamada cuando el teclado virtual se desliza hacia adentro o hacia afuera.
Pieter Witvoet
keyboardHidden no se activa mediante el teclado de software, solo mediante teclados de hardware, como el teclado deslizante del Droid.
RMN
10
Debería agregar "screenSize" en android:configChanges Esto es lo que dijo 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 genial! agregando screenSize se pone a llamar enConfigurationChanged!
Manuela
Hola, estoy usando Theme.Holo.Light.NoActionBar theme. Para este, mi actividad se reinicia. ¿Hay alguna forma de evitar que la actividad se reinicie?
Manukumar

Respuestas:

250

Este fue mi gremlin por el mismo problema:

Precaución: a partir de Android 3.2 (API nivel 13), el "tamaño de la pantalla" también cambia cuando el dispositivo cambia entre orientación vertical y horizontal. Por lo tanto, si desea evitar que se reinicie el tiempo de ejecución debido al cambio de orientación al desarrollar para el nivel API 13 o superior (según lo declarado por los atributos minSdkVersion y targetSdkVersion), debe incluir el valor "screenSize" además del valor de "orientación". Es decir, debe descartar android: configChanges = "oriente | screenSize". Sin embargo, si su aplicación apunta al nivel de API 12 o inferior, entonces su actividad siempre maneja este cambio de configuración en sí mismo (este cambio de configuración no reinicia su actividad, incluso cuando se ejecuta en un dispositivo Android 3.2 o superior).

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

TL; DR: agregue "| screenSize" a configChanges cuando apunte a API nivel 13+

RMN
fuente
9
wow, solo un atributo para agregar y maldita sea eso, +1desde mi lado "screenSize"lo fue.
Anuj
@philipp ¿Qué significaría establecer la orientación del sensor? No estoy seguro de cómo sería útil. Gracias por la edición sin embargo.
RMN
4 años después, la gente todavía es mordida por esto :)
Daniel Wilson
Gracias. Pasé 30 minutos golpeándome la cabeza contra la pared.
lagos
Esta es la solución perfecta
Anbarasu Chinna
40

Algunos dispositivos de 4.0 no llaman a onConfigurationChanged. Simplemente agregue un oyente a screenSize también.

android:configChanges="orientation|screenSize"
Corbella
fuente
Esto resolvió mi problema. Reemplazar onConfigurationChanged, probar contra Configuration.ORIENTATION_LANDSCAPEe incluir SOLO android:configChanges="orientation"en el manifiesto no fue suficiente para mi tableta Nexus 7. Gracias
Jantzilla
37

El problema era que si usabas este método

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

para forzar la orientación de su Activitymodo vertical, no es candidato para recibir orientationcambios.

Entonces la solución es no setRequestOrientationa un modo particular. Pero en lugar de usarSCREEN_ORIENTATION_SENSOR.

lblasa
fuente
55
sí, eso funciona, pero ¿qué pasa si no quiero que mi aplicación gire? Quiero que permanezca en modo horizontal.
stoefln
debe especificar <activity android: name = ". MyActivity" android: screenOrientation = "landscape"> </activity> en su archivo de manifiesto
Qadir Hussain
3
¿Cómo uso esto (cuando el usuario hace clic en "pantalla completa" en un reproductor de video) Y también sigo recibiendo onConfigChanged, cuando el usuario gira su teléfono. El mismo comportamiento que en la aplicación de YouTube. Esto es posible?
Vucko
29

compruebe que su dispositivo tiene la configuración "Rotación de pantalla" activada

Configuración de "rotación de pantalla"

Dmitry Kolesnikovich
fuente
77
Tuve este problema divertido ...: D
Dharmendra
¿Es posible rotar la actividad aunque la opción "Rotación de pantalla" esté DESACTIVADA? En caso afirmativo, dígame cómo hacer eso ... Según mi entendimiento, no funcionará, pero algunas aplicaciones rotan la actividad al paisaje.
Srinivasan
1
¡¡¡S t!!! ¡Pasé de 4 a 5 horas intentando que mi código funcione! Una forma de anular esto, como aprendo de otra respuesta, es incluir <android: orientación = "sensor"> en el manifiesto
suku
19
  1. Compruebe que no está utilizando android:screenOrientationen un nivel Activityo en uno Application.
  2. Intenta usar en su android:configChanges="orientation|keyboardHidden"lugar.
Macarse
fuente
1
¿Cómo puedo usar android: screenOrientation y quiero ejecutar el método onConfigurationChanged, qué puedo hacer, gracias
Bingchean
17

Pasé decenas de minutos para descubrir por qué no funcionó. yo añadíscreenSize pero todavía no funcionó.

Resultó que había agregado android:configChangesal <application>elemento, no al<activity> elemento como debería haberlo hecho!

Bueno, por supuesto, este fue mi error, pero todos sabemos que todos pasamos mucho tiempo por este tipo de error tonto. Por lo tanto, estoy agregando esta respuesta en caso de que haya otro programador tonto como yo.

Malditas verduras
fuente
También estoy haciendo lo mismo, gracias, me
salvaste
Ho gracias tio
Laurent
14

Macarse tiene el 100% del dinero con su segunda opción.

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

Tuve exactamente el mismo problema, y ​​en el emulador 1.6 agregué keyboardHiddencausas onConfigurationChangeda las que llamar durante la rotación. Retíralo y deja de llamarse.

Guillermo
fuente
5

Tuve el mismo problema: onConfigurationChangedno se me llamó cuando el dispositivo cambió de orientación a pesar de tenerlo android:configChanges="orientation|keyboardHidden"en el archivo de manifiesto. Usé el código recortado compartido por Devaaquí

la orientación no funciona en 2.3.3?

para verificar si onConfigurationChanged se estaba llamando. No era.

Después de algunas horas de experimentar, me di cuenta de que tenía las siguientes líneas en el archivo de manifiesto

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

y al cambiar android:targetSdkVersion="15"a android:targetSdkVersion="8", onConfigurationChangedcomenzó a ser llamado. Entonces, parte del manifiesto finalmente se veía así

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="8"/>
aLearner
fuente
9
El problema que tiene es el atributo que falta: screenize. Por favor actualice su respuesta. Esta será una "solución" engañosa para los desarrolladores principiantes de
Android
@ user1281750 Gracias, pero como desarrollador principiante de Android, no estoy seguro de qué es exactamente lo que estás diciendo.
aLearner
@aLearner Creo que lo que significó user1281750: ¡Esto no es realmente una solución! ¿Qué pasa si necesita una versión SDK más alta?
AgentKnopf
Compartí lo que funcionó para mí. Me doy cuenta de que esto puede no ser "la" solución. ¿Pero cuál es la alternativa? ¿Cuál es la solución 'correcta'? ¿Y qué se entiende por 'desaparecidos attribute: screensize'? Puede ser útil si se proporcionan más detalles.
aLearner
Gracias amigo, esta solución resolvió mi gran tensión jajaja. Estuve navegando durante una hora para obtener esto ... también funciona en todas las versiones actualizadas
Sampath Kumar
3

Acabo de descubrir que si tienes:

android:screenOrientation="landscape"

en el manifiesto, onConfigurationChanged () no se llamará también ...

Esto puede ser similar a:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

esa orientación de configuración bloquea el onConfigurationChanged ().

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

No use ninguna versión de SDK de destino para complicarlo. y para todos los niveles de API use esto como escucha de cambio de configuración

android:configChanges="orientation|keyboardHidden|screenLayout"
Sampath Kumar
fuente
3

No estoy seguro de que este sea el mejor lugar para ello, pero al encontrarme con este problema, observé algo interesante.

Si el oyente onConfigurationChanged () NO funciona, se llama nuevamente a onCreate () cada vez que se cambia la orientación.

Si el oyente onConfigurationChanged () está funcionando, entonces se llama a ese método en lugar del onCreate () cuando cambia la orientación.

Gene Bo
fuente
Esto es lo que estoy viendo, pero no quiero ser. Y según los documentos, no debería estar sucediendo de esta manera. Muy confuso.
slycrel
2

Todas las soluciones no funcionan util. Intento eliminar mi actividad de tema en el archivo de manifiesto de Android. Tan extraña

<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
fuente
¿Hay alguna forma de evitar que la actividad se reinicie sin eliminar windowNoTitle?
Manukumar
2

Ninguna de las sugerencias funcionó para mí (tuve un proyecto nativo con este problema), pero después de horas de depuración descubrí que si tienes esta línea en el AppTheme de styles.xml

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

entonces la aplicación no rotará.

Matej Ukmar
fuente
1

@ thanhbinh84 Me dio una idea de lo que podría estar causando esto.
¡Eliminarlo <item name="android:windowIsTranslucent">true</item> de mi tema en styles.xml lo arregló!

Nitsan
fuente
0

Tuve el mismo problema y tenía "android: screenOrientation" y "android: configChanges" especificados en el manifiesto. Cuando eliminé el primero, onConfigurationChanged () fue llamado en la rotación. Extraño pero funciona)

Mezcla
fuente
1
¿Pero cómo rotas entonces?
Mark Molina el
-2

¿Tienes android.content.res.Configurationen tus declaraciones de importación? Eclipse puede insertar importaciones automáticamente si presiona Ctrl+Shift+O.

Si eso falta, el compilador no podrá reconocer que está anulando legítimamente el método de superclase y, por lo tanto, arrojará un error.

Mark Mooibroek
fuente
Sí, la importación ya está implementada, ¿alguna idea? porque no recibo ningún error ni nada, es solo que no me llaman.
lblasa
No sé si esto podría estar relacionado con el hecho de que toda la aplicación se realiza en modo vertical. La actividad en la que necesito manejar onConfigurationChangedEvent es una actividad contenida dentro de un TabHost cuyo modo es vertical. Pero de todos modos, no he encontrado ningún comentario de que esto sea un problema para atrapar ese evento. Estoy realmente sin ideas.
lblasa