2012-02-29 15 views
18

Ecco uno pseudo codice per rilevare l'evento di rotazione dello schermo e decidere di mantenere o modificare l'orientamento dello schermo.Android determina l'orientamento dello schermo in fase di esecuzione

public boolean onOrientationChanges(orientation) { 
    if(orientation == landscape) 
    if(settings.get("lock_orientation")) 
     return false; // Retain portrait mode 
    else 
     return true; // change to landscape mode 

    return true; 
} 

Come faccio a fare cose simili in Android?

EDIT: realtà sto cercando risposta su Dove gestire l'orientamento cambia. Non voglio correggere l'orientamento aggiungendo screenOrientation = "portrait".

Ho bisogno di qualcosa, simile a onConfigurationChanges(), dove posso gestire l'orientamento, ma non ho bisogno di ridisegnare manualmente la vista.

+0

Non è necessario per intercettare la richiesta e quindi consentire o negare. È possibile bloccare o liberare l'orientamento in anticipo. Ci sono anche più opzioni con questo metodo, come se consentire una rotazione di 180 gradi quando bloccato. Si prega di leggere la mia risposta qui sotto, piuttosto che quella selezionata. –

risposta

42

Hai bisogno di un esempio Display in primo luogo:

Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 

Poi l'orientamento può essere chiamato in questo modo:

int orientation = display.getOrientation(); 

controllare l'orientamento come la tua strada e utilizzare questo per cambiamento dell'orientamento:

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

Spero che sia aiuta.

Aggiornamento:

Va bene, diciamo che hai un oAllow var che è Boolean e il valore predefinito è False.

public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 
    int orientation = display.getOrientation(); 
    switch(orientation) { 
     case Configuration.ORIENTATION_PORTRAIT: 
      if(!oAllow) { 
        setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
      } 
      break; 
     case Configuration.ORIENTATION_LANDSCAPE: 
      if(!oAllow) { 
        setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
      } 
      break; 
    } 
} 

È possibile aggiungere più scelte.

Non ho provato questo esempio, ma almeno ti dice alcuni indizi su come risolvere. Dimmi se hai qualche errore.

UPDATE

getOrientation() è già deprecato see here. Utilizzare invece getRotation().Per verificare se il dispositivo è in modalità orizzontale si può fare qualcosa di simile:

Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)) 
     .getDefaultDisplay(); 

int orientation = display.getRotation(); 

if (orientation == Surface.ROTATION_90 
     || orientation == Surface.ROTATION_270) { 
    // TODO: add logic for landscape mode here    
} 
+0

grazie ma dove inserisco il codice? Intendo quale evento/funzione viene attivato quando viene modificato l'orientamento? –

+0

@kenyi Semplicemente cosa vuoi fare? Dare più dettagli. Hai solo bisogno di gestire l'orientamento o cosa? Aggiornerò la mia risposta –

+0

Prima che il dispositivo cambi l'orientamento, ho bisogno di determinare se è consentita la modalità orizzontale, in runtime. Diciamo che se l'utente ha disattivato la modalità orizzontale, l'app rimarrà in modalità verticale. –

17

provare a eseguire

getResources().getConfiguration().orientation 

Dal vostro oggetto di contesto per capire qual è l'orientamento dello schermo in fase di esecuzione, i possibili valori sono documentati here

al fine di catturare l'evento di modifica dell'orientamento si può trovare la risposta nella Guida Android Dev: Handling the Configuration Change Yourself

Dalla guida:

Ad esempio, il seguente codice manifesto dichiara un'attività che gestisce sia il cambiamento orientamento dello schermo e la disponibilità della tastiera cambiamento:

< attività android: name =
"MyActivity." Android: configChanges = "orientamento | keyboardHidden"
android: label = "@ string/app_name" >

Ora, quando uno di questi conf le modifiche cambiano, MyActivity non si riavvia. Invece, MyActivity riceve una chiamata a onConfigurationChanged(). Questo metodo viene passato un oggetto Configuration che specifica la nuova configurazione del dispositivo. Leggendo i campi nella configurazione, è possibile determinare la nuova configurazione e apportare le modifiche appropriate aggiornando le risorse utilizzate nell'interfaccia. Quando viene chiamato questo metodo, l'oggetto Risorse della tua attività viene aggiornato per restituire le risorse in base alla nuova configurazione, in modo da poter ripristinare facilmente gli elementi dell'interfaccia utente senza che il sistema riavvii l'attività.

...

+0

Ciao, ho aggiornato la mia domanda. So come recuperare l'orientamento dello schermo, ho bisogno di sapere dove gestirlo. –

+0

Ciao, controlla l'ultimo link nella mia risposta ... [Gestire la configurazione cambia tu stesso] (http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange). Ho modificato la mia risposta con qualche informazione in più – Talihawk

2
if (this.getWindow().getWindowManager().getDefaultDisplay() 
    .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) { 
    // portrait mode 
} else if (this.getWindow().getWindowManager().getDefaultDisplay() 
      .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) { 
    // landscape 
} 
1

Non è necessario per intercettare l'evento e poi sostituirla. Basta usare:

// Allow rotation 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER); 
// Lock rotation (to Landscape) 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE); 

Punti da notare qui sono, se il Jellybean e, soprattutto, questo permetterà una rotazione di 180 gradi quando è bloccato. Inoltre, se sbloccato, consente la rotazione solo se le impostazioni master dell'utente consentono la rotazione. È possibile proibire rotazioni di 180 gradi e ignorare le impostazioni master e consentire la rotazione, e molto altro ancora, quindi dai un'occhiata alle opzioni in ActivityInfo

Inoltre, se hai pre-impostato che non ci sia alcuna rotazione, allora il tuo l'attività non verrà distrutta e quindi riavviata, solo per poter ripristinare l'orientamento che farà nuovamente riavviare l'attività; Quindi impostare in anticipo ciò che si desidera può essere molto più efficiente.

Pre uso Jellybean ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE - nessuna rotazione di 180 gradi con questo.

0

Controllare l'orientamento dello schermo Android in fase di esecuzione:

ListView listView = (ListView) findViewById(R.id.listView1); 
if (getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) { 
    //do work for landscape screen mode. 
    listView.setPadding(0, 5, 0, 1); 
} else if (getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) { 
    //Do work for portrait screen mode. 
    listView.setPadding(1, 10, 1, 10); 
} 
Problemi correlati