Domanda

Ho una domanda che ho appena piacerebbe utilizzare in modalità verticale, così ho definito Android: screenOrientation = "ritratto" in XML manifesto. Questo funziona bene per la HTC Magic telefono (e impedisce modifiche di orientamento su altri telefoni pure).

Ma ho un problema con il HTC G1 telefono come apro l'hardware tastiera QWERTY (non la tastiera virtuale). La mia attività rimane in modalità ritratto, ma sembra avere riavviato e perde tutti i suoi stati. Questo non accade con la versione HTC Hero .

La mia domanda è abbastanza grande, quindi non voglio che per riavviare e perdere tutti i suoi stati quando la tastiera è aperta. Come posso evitare questo?

È stato utile?

Soluzione

Aggiornamento aprile 2013: Non fare questo. Non è stata una buona idea, nel 2009, quando ho risposto alla domanda e non è davvero una buona idea ora. Vedere questa risposta da hackbod per motivi:

Evitare di ricaricare l'attività con AsyncTask sul cambiamento dell'orientamento in Android

Aggiungi android:configChanges="keyboardHidden|orientation" al AndroidManifest.xml. Questo dice al sistema di quali cambiamenti di configurazione che si sta per gestire da soli -. In questo caso per non fare nulla

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

configChanges per ulteriori dettagli.

Tuttavia, l'applicazione può essere interrotta in qualsiasi momento, ad esempio, da una telefonata, così si dovrebbe aggiungere il codice per salvare lo stato della vostra applicazione quando è in pausa.

Aggiornamento: A partire da Android 3.2, è inoltre necessario aggiungere "Screensize":

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

Da guida Developer Gestione della configurazione cambiare se stessi

  

Attenzione: A partire da Android 3.2 (API di livello 13), la "dimensione dello schermo"   cambia anche quando il dispositivo commuta tra verticale e orizzontale   orientamento. Quindi, se si vuole evitare un riavviamento di runtime dovuti a   modifica dell'orientamento non sviluppa per API di livello 13 o superiore (come   dichiarati dal minSdkVersion e gli attributi targetSdkVersion), è   deve includere il valore "Screensize" oltre alla "orientamento"   valore. Cioè, è necessario dichiarare   android:configChanges="orientation|screenSize". Tuttavia, se il   obiettivi applicativi livello di API 12 o più basso, allora la vostra attività sempre   gestisce la modifica alla configurazione in sé (la modifica alla configurazione   non riavviare l'attività, anche se in esecuzione su un Android 3.2 o   superiore del dispositivo).

Altri suggerimenti

È necessario modificare AndroidManifest.xml come Intrications (in precedenza Ashton) menzionato e assicurarsi che l'attività gestisce l'evento onConfigurationChanged come lo vuoi gestito. Questo è come dovrebbe apparire:

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

Ho sempre trovato il necessario sia

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

Come detto, impostare android:configChanges della vostra attività (nel file manifesto) per keyboardHidden|orientation e poi:

1) Override onConfigurationChanged()

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

2) Aggiungere questa riga al onCreate() della vostra attività

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

E 'meglio che aggiungere stessa linea per onConfigurationChanged, perché la vostra applicazione si trasformi in modalità verticale e poi di nuovo al paesaggio (avverrà solo una volta, ma è fastidioso).

Inoltre è possibile impostare android:screenOrientation="nosensor" per la vostra attività (in manifesto). Ma utilizzando questo modo un non sei in grado di gestire l'orientamento cambia affatto.

Utilizzare questa ..

    android:screenOrientation="portrait"

Nel metodo OnCreate della vostra attività di questo codice:

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

Ora l'orientamento verrà impostato su ritratto e non cambierà mai.

Nel file AndroidManifest.xml, per ogni attività che si desidera bloccare aggiungere l'ultima riga screenOrientation:

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

o Android:. ScreenOrientation = "paesaggio"

AndroidManifest.xml file:

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

o

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

Per bloccare lo schermo dal codice è necessario utilizzare la rotazione effettiva dello schermo (0, 90, 180, 270) e si deve conoscere la posizione naturale di esso, in uno smartphone posizione naturale sarà verticale e in un tablet, sarà orizzontale.

Ecco il codice (bloccare e sbloccare i metodi), è stato testato in alcuni dispositivi (smartphone e tablet) e funziona benissimo.

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);
}

In Visual Studio Xamarin:

  1. Aggiungi:

using Android.Content.PM; a voi elenco delle attività dello spazio dei nomi.

  1. Aggiungi:

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

come un attributo di classe a voi, così:

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

Aggiungi

android:configChanges="keyboardHidden|orientation|screenSize" 

per il vostro manifesto.

Si prega di notare, nessuno dei metodi sembra funzionare ora!

Android studio 1 Un modo semplice è quello di aggiungere android:screenOrientation="nosensor".

Ciò blocca efficacemente l'orientamento dello schermo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top