¿Cómo desactivo el cambio de orientación en Android?
Tengo una aplicación que me gustaría usar en modo vertical, así que definí android:screenOrientation="portrait" en el manifiesto XML. Esto funciona bien para el HTC Magic. (y también evita cambios de orientación en otros teléfonos).
Pero tengo un problema con el teléfono HTC G1 cuando abro el teclado QWERTY de hardware (no el teclado virtual). Mi actividad permanece en modo vertical, pero parece reiniciarse y pierde todos sus estados. Esto no pasa con el HTC Hero .
Mi aplicación es bastante grande, por lo que no quiero que se reinicie y pierda todos sus estados cuando se abre el teclado. ¿Cómo puedo evitar eso?
Actualización de abril de 2013: no hagas esto. No fue una buena idea en 2009 cuando respondí la pregunta por primera vez y realmente no lo es ahora. Vea esta respuesta de hackbod por razones:
Evite recargar la actividad con asynctask al cambiar de orientación en Android
Agréguelo android:configChanges="keyboardHidden|orientation"
a su AndroidManifest.xml. Esto le indica al sistema qué cambios de configuración va a realizar usted mismo (en este caso, sin hacer nada).
<activity android:name="MainActivity"
android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation">
Consulte configChanges de referencia para desarrolladores para obtener más detalles.
Sin embargo, su aplicación puede ser interrumpida en cualquier momento, por ejemplo, por una llamada telefónica, por lo que realmente debería agregar código para guardar el estado de su aplicación cuando esté en pausa.
Actualización: a partir de Android 3.2, también es necesario agregar "tamaño de pantalla":
<activity
android:name="MainActivity"
android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation|screenSize">
De la guía para desarrolladores Cómo manejar el cambio de configuración usted mismo
Precaución: a partir de Android 3.2 (API nivel 13), el "tamaño de 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 a un cambio de orientación al desarrollar para el nivel de 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, debes declarar
android:configChanges="orientation|screenSize"
. Sin embargo, si su aplicación tiene como objetivo el nivel API 12 o inferior, entonces su actividad siempre maneja este cambio de configuración por sí misma (este cambio de configuración no reinicia su actividad, incluso cuando se ejecuta en un dispositivo Android 3.2 o superior).
Debe modificar AndroidManifest.xml como lo mencionó Intrications (anteriormente Ashton) y asegurarse de que la actividad maneje el evento onConfigurationChanged como usted desea. Así es como debería verse:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Siempre he descubierto que necesitas ambos
android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"
Como se dijo, configure android:configChanges
su Actividad (en el archivo de manifiesto) en keyboardHidden|orientation
y luego:
1) AnularonConfigurationChanged()
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//here you can handle orientation change
}
2) Añade esta línea a tu actividadonCreate()
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Es mejor que agregar la misma línea a onConfigurationChanged
, porque su aplicación cambiará al modo vertical y luego volverá al modo horizontal (sucederá solo una vez, pero es molesto).
También puedes configurar android:screenOrientation="nosensor"
tu actividad (en manifiesto). Pero de esta manera no podrás manejar los cambios de orientación en absoluto.