¿Cómo desactivo el cambio de orientación en Android?

Resuelto Vidar Vestnes asked hace 54 años • 15 respuestas

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?

Vidar Vestnes avatar Jan 01 '70 08:01 Vidar Vestnes
Aceptado

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

Intrications avatar Oct 02 '2009 23:10 Intrications

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);
}
ubershmekel avatar Mar 04 '2011 23:03 ubershmekel

Siempre he descubierto que necesitas ambos

android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"
m00sey avatar Jul 09 '2011 19:07 m00sey

Como se dijo, configure android:configChangessu Actividad (en el archivo de manifiesto) en keyboardHidden|orientationy 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.

Dmitry Zaytsev avatar Jan 15 '2012 14:01 Dmitry Zaytsev