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

Tengo una aplicación que simplemente me gustaría usar en modo retrato, por lo que he definido android: screenOrientation = “portrait” en el manifiesto XML. Esto funciona bien para el teléfono 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 que se reinicia y pierde todos sus estados. Esto no ocurre con la versión HTC Hero .

Mi aplicación es bastante grande, así que no quiero que se reinicie y pierda todos sus estados cuando se abre el teclado. ¿Cómo puedo prevenir 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 es una buena idea ahora. Ver esta respuesta por hackbod por razones:

    Evita la actividad de recarga con asynctask en el cambio de orientación en Android

    Agregue android:configChanges="keyboardHidden|orientation" a su AndroidManifest.xml. Esto le dice al sistema qué cambios de configuración manejará usted mismo, en este caso al no hacer nada.

      

    Ver Developer reference configChanges para más detalles.

    Sin embargo, su aplicación se puede interrumpir en cualquier momento, por ejemplo, mediante 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 debe agregar “screenSize”:

      

    De la guía del desarrollador Manejo de la configuración Cambie usted mismo

    Precaución: a partir de Android 3.2 (nivel de API 13), el “tamaño de pantalla” también cambia cuando el dispositivo cambia entre la 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 cuando se desarrolla para API nivel 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 declarar android:configChanges="orientation|screenSize" . Sin embargo, si su aplicación se dirige al nivel API 12 o inferior, su actividad siempre maneja esta configuración por sí misma (este cambio de configuración no reinicia su actividad, incluso cuando se ejecuta en un dispositivo con Android 3.2 o superior).

    Necesita modificar AndroidManifest.xml como Intrications (anteriormente Ashton) mencionado y asegurarse de que la actividad maneje el evento onConfigurationChanged como desee que se maneje. Así es como debería verse:

     @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } 

    Siempre he encontrado que necesitas ambos

     android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation" 

    Como se dijo, configure android:configChanges de su actividad (en el archivo de manifiesto) en keyboardHidden|orientation y luego:

    1) Reemplazar onConfigurationChanged()

     @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); //here you can handle orientation change } 

    2) Agregue esta línea a onCreate() su actividad

     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

    Es mejor que agregar la misma línea a onConfigurationChanged , ya que su aplicación cambiará al modo retrato y luego a paisaje (solo ocurrirá una vez, pero es molesto).

    También puedes configurar android:screenOrientation="nosensor" para tu actividad (en manifiesto). Pero al usarlo de esta manera, no podrá manejar los cambios de orientación en absoluto.

    Utilizar esta..

      android:screenOrientation="portrait" 

    En el método OnCreate de su actividad use este código:

      @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

    Ahora su orientación se configurará en vertical y nunca cambiará.

    En el archivo AndroidManifest.xml, para cada actividad que desee bloquear, agregue la última línea de screenOrientation :

     android:label="@string/app_name" android:name=".Login" android:screenOrientation="portrait" > 

    O Android: screenOrientation = “paisaje” .

    En su archivo androidmanifest.xml :

       

    o

     @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } 

    Para bloquear la pantalla por código, debe usar la rotación real de la pantalla (0, 90, 180, 270) y debe conocer su posición natural; en un teléfono inteligente, la posición natural será el retrato y en una tableta, será paisaje

    Aquí está el código (métodos de locking y deslocking), ha sido probado en algunos dispositivos (teléfonos inteligentes y tabletas) y funciona muy bien.

     public static void lockScreenOrientation(Activity activity) { WindowManager windowManager = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE); Configuration configuration = activity.getResources().getConfiguration(); int rotation = windowManager.getDefaultDisplay().getRotation(); // Search for the natural position of the device if(configuration.orientation == Configuration.ORIENTATION_LANDSCAPE && (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) || configuration.orientation == Configuration.ORIENTATION_PORTRAIT && (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270)) { // Natural position is Landscape switch (rotation) { case Surface.ROTATION_0: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); break; case Surface.ROTATION_90: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); break; case Surface.ROTATION_180: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); break; case Surface.ROTATION_270: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); break; } } else { // Natural position is Portrait switch (rotation) { case Surface.ROTATION_0: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); break; case Surface.ROTATION_90: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); break; case Surface.ROTATION_180: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); break; case Surface.ROTATION_270: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); break; } } } public static void unlockScreenOrientation(Activity activity) { activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); } 

    En Visual Studio Xamarin:

    1. Añadir:

    using Android.Content.PM; a tu lista de espacio de nombres de actividad.

    1. Añadir:

    [Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]

    como un atributo para tu clase, así:

     [Activity(ScreenOrientation = ScreenOrientation.Portrait)] public class MainActivity : Activity {...} 

    Añadir

     android:configChanges="keyboardHidden|orientation|screenSize" 

    a tu manifiesto

    Tenga en cuenta que ninguno de los métodos parece funcionar ahora.

    En Android Studio 1, una forma sencilla es agregar android:screenOrientation="nosensor" .

    Esto efectivamente bloquea la orientación de la pantalla.