2011-10-07 12 views
14

Desidero che la mia attività sia disponibile solo in entrambe le modalità ritratto: verticale e inverso. Come posso raggiungere questo obiettivo? Quando imposto lo android:screenOrientation="portrait" forzerà l'attività solo nel ritratto normale - viceversa con reversePortrait.Solo attività ritratto o ritratto retrospettivo

Per favore, non dirmi che è un cattivo approccio per forzare/bloccare l'orientamento. Ne sono al corrente, ma il cliente lo sta ancora richiedendo. Grazie per la comprensione e per qualsiasi idea.

UPDATE: API livello 11 e superiori

+4

Non è un cattivo approccio IMO, alcune applicazioni/giochi semplicemente non funzionerà proprio in certi orientamenti. – Ricky

+0

Grazie Ricky, esattamente. Ho visto persone che discutevano di questo su post simili, quindi volevo chiarire che avevo davvero bisogno solo di un ritratto. – Speedy

+0

molte applicazioni di e-commerce bloccano anche l'orientamento – Killer

risposta

37

Se si è a livello di API 9+, utilizzare android:screenOrientation="sensorPortrait".

Portrait orientation, but can be either normal or reverse portrait based on the device sensor. Added in API level 9.

Documentation

+0

Grazie !!! Devo essere cieco che ho perso quel valore! E sì, sono su API 11+, quindi funziona perfettamente. – Speedy

+4

Ho dovuto usare la versione digitata "sensorPortait" su api 15. – Richard

+0

Ruota correttamente la vista ma non genera alcun evento. Devo catturare l'evento quando l'orientamento cambia da vista normale a vista inversa. Come farlo? – StarDust

1

In AndroidManifest.xml:

android:screenOrientation="portrait|reversePortrait" 
android:configuration="keyboardHidden|orientation" 

Nel vostro WhateverActivity.java:

protected void onConfigurationChanged(Configuration newConfig) { 
    int currentOrientation = getResources().getConfiguration().orientation; 
    if(newConfig.orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT || 
     newConfig.orientation == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT) { 
     super.onConfigurationChanged(newConfig); 
    } 
} 

si può provare questo :)

+0

Grazie, questa è una buona risposta, ma come ho dimenticato di dire che sono su API 11+ (Honeycomb) la risposta di alextc è più adatta per me e funziona alla grande. E non so perché, ma ho ricevuto un errore AAPT quando provo a usare | in screenOrientation quindi non ero in grado di utilizzare due valori, ma solo uno :( – Speedy

+12

@xjaphx, android: screenOrientation = "portrait | reversePortrait" .Questo non funziona. Viene visualizzato il seguente errore: "errore: errore: tipi di stringhe non consentiti (a 'screenOrientation' con valore 'portrait | reversePortrait') ". –

+0

@PaulAnnekov Questo perché è un enum semplice, quindi non è possibile utilizzare una combinazione di valori usando" | " –

1

Per l'amor di posteri, io uso questo per garantire la compatibilità ...

public final class OrientationHelper { 

    @TargetApi(Build.VERSION_CODES.GINGERBREAD) 
    public static void setRequestedOrientationSensorPortrait(Activity activity) { 
     if (Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO) { 
      activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); 
     } else { 
      activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     } 
    } 

    @TargetApi(Build.VERSION_CODES.GINGERBREAD) 
    public static void setRequestedOrientationSensorLandscape(Activity activity) { 
     if (Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO) { 
      activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 
     } else { 
      activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
     } 
    } 
} 

utilizzo

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    OrientationHelper.setRequestedOrientationSensorPortrait(this); 
    super.setContentView(R.layout.my_layout); 
} 
Problemi correlati