Pregunta

Tengo una aplicación que acabo gustaría utilizar en modo vertical, por lo que he definido Android: screenOrientation = "retrato" en el manifiesto XML. Esto funciona bien para el teléfono HTC Magic (y evita los cambios de orientación en otros teléfonos también).

Pero tengo un problema con el HTC G1 teléfono al abrir el hardware teclado QWERTY (no el teclado virtual). Mi actividad se mantiene en el modo vertical, pero parece que se pierde reiniciado y todos sus estados. Esto no sucede con el versión HTC Hero .

Mi aplicación es bastante grande, así que no quiero que se reinicie y perder todos sus estados cuando se abre el teclado. ¿Cómo puedo evitar eso?

¿Fue útil?

Solución

Update Abril 2013: No haga esto. No fue una buena idea en 2009 cuando por primera vez respondido a la pregunta y realmente no es una buena idea ahora. Ver esta respuesta por hackbod por razones:

Evite recargar la actividad con AsyncTask en cambio de orientación en androide

Añadir android:configChanges="keyboardHidden|orientation" a su AndroidManifest.xml. Esto le indica al sistema qué cambios de configuración que se va a manejar a sí mismo -. En este caso por no hacer nada

<activity android:name="MainActivity"
     android:screenOrientation="portrait"
     android:configChanges="keyboardHidden|orientation">

configChanges para más detalles.

Sin embargo, su aplicación se puede interrumpir en cualquier momento, por ejemplo, por una llamada telefónica, lo que realmente debe agregar código para guardar el estado de su aplicación cuando se está en pausa.

Actualización: A partir de Android 3.2, también hay que añadir "ScreenSize":

<activity
    android:name="MainActivity"
    android:screenOrientation="portrait"
    android:configChanges="keyboardHidden|orientation|screenSize">

A partir de guía desarrollador Manejo de la configuración de cambiarse a sí mismo

  

Precaución: A partir de Android 3.2 (API nivel 13), el "tamaño de la pantalla"   también cambia cuando el aparato conmuta entre el retrato y el paisaje   orientación. Por lo tanto, si desea evitar un rearranque de tiempo de ejecución debido a   cambio de orientación en el desarrollo para el nivel API 13 o más alto (como se   declarado por el minSdkVersion y atributos targetSdkVersion), se   debe incluir el valor "ScreenSize" además de la "orientación"   valor. Es decir, debe declarar   android:configChanges="orientation|screenSize". Sin embargo, si su   objetivos de aplicación de nivel API 12 o inferior, a continuación, su actividad siempre   maneja este cambio de configuración en sí (este cambio de configuración   no reinicie su actividad, incluso cuando se ejecuta en un Android 3.2 o   dispositivo superior).

Otros consejos

Es necesario modificar AndroidManifest.xml como Intrications (anteriormente Ashton) mencionado y asegurarse de que la actividad controla el evento onConfigurationChanged como quiera que maneja. Esta es la forma en que debe ser:

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

Siempre he encontrado que necesita tanto

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

Como se ha dicho, establecer android:configChanges de su actividad (en el archivo de manifiesto) a keyboardHidden|orientation y luego:

1) Override onConfigurationChanged()

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

2) Añada esta línea al onCreate() de su actividad

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Es mejor que añadir misma línea para onConfigurationChanged, debido a que su aplicación se convertirá en el modo vertical y luego de vuelta a horizontal (que va a pasar sólo una vez, pero es molesto).

También puede configurar android:screenOrientation="nosensor" para su actividad (en el manifiesto). Pero el uso de esta forma de un no eres capaz de manejar la orientación cambia en absoluto.

Utilice esta ..

    android:screenOrientation="portrait"

En el método OnCreate de la actividad de uso de este código:

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

Ahora su orientación se establece en el retrato y nunca va a cambiar.

En el archivo AndroidManifest.xml, para cada actividad que desea bloquear añadir la última línea screenOrientation:

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

o Android:. ScreenOrientation = "paisaje"

AndroidManifest.xml archivo:

   <activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation">

o

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

Para bloquear la pantalla por código tiene que utilizar la rotación real de la pantalla (0, 90, 180, 270) y que tiene que conocer la posición natural de la misma, en un teléfono inteligente la posición natural será retrato y en una tableta, será paisaje.

Aquí está el código (bloquear y desbloquear métodos), que ha sido probado en algunos dispositivos (smartphones y tablets) 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 que la actividad de la lista de espacio de nombres.

  1. Añadir:

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

como un atributo de la clase que, al igual que:

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

Añadir

android:configChanges="keyboardHidden|orientation|screenSize" 

a su manifiesto.

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

Estudio Android 1 de una manera sencilla es añadir android:screenOrientation="nosensor".

Esto bloquea efectivamente la orientación de la pantalla.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top