2011-03-24 21 views
23

Tengo una actividad que siempre debe mostrarse en Modo de paisaje. Entonces agregué android:screenOrientation="landscape".Cómo mantener la pantalla en modo horizontal en Android

Pero el problema es cuando giro el dispositivo por 180 grados, la pantalla se invierte. ¿Hay alguna manera de manejar este problema para que los elementos de la pantalla siempre se muestren correctamente?

+0

¿Desea que esté en el paisaje o en el paisaje inverso? –

+0

@RobbyPond ahora mismo estoy enfrentando un problema en el que quiero que mi aplicación sea también paisaje y paisaje invertido. Entonces, ¿qué pasa si requiero tanto en el modo? –

Respuesta

7

Así que para toda la información, esto es lo que hice.

  1. En Android manifest agregado android: screenOrientation = "landscape".
  2. En el método de reanudación de añadir estas líneas de código
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 
int orientation = display.getRotation(); 

if(orientation==Surface.ROTATION_180) 
{ 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); 
} 

De esta manera la pantalla siempre se coloca correctamente, incluso si el usuario mantiene el dispositivo boca abajo.

+0

no funciona para mí, ya que no volverá a llamar a Reesume después de la rotación – Jacky

0

Hmmm. Esto también depende un poco de la versión de marco que está utilizando. Intente esto como un comienzo:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

Si eso funciona bien. Si no es necesario, díganos un poco más sobre el diseño de su aplicación.

+0

Sí. yo lo hice. aquí está lo que se pone en mi método onResume Display display = ((WindowManager) getSystemService (WINDOW_SERVICE)). getDefaultDisplay(); \t \t int orientation = display.getRotation(); \t \t if ((orientación == Surface.ROTATION_90) || (orientación == Surface.ROTATION_270)) { \t \t \t setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); \t \t} else if (orientación == Surface.ROTATION_180) { \t \t \t setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); – prashant

+1

que con toda justicia debería funcionar. ¡Buen trabajo! – Taranasus

2

En el manifiesto de Android escribir esto:

android:configChanges="orientation" 
       android:screenOrientation="landscape" 

como en el ejemplo siguiente.

<activity android:name=".MainActivity" 
       android:label="@string/app_name" 
       android:configChanges="orientation" 
       android:screenOrientation="portrait"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
55

En realidad lo que realmente quiere es especificar:

android:screenOrientation="sensorLandscape" 

en su AndroidManifest.xml. Esto escuchará los datos del sensor al ajustar entre landscape e reverseLandscape.

+0

+1 Thany CaseyB, solo toma 1 minuto implementar ambas orientaciones. Una vez más, gracias por ahorrarme mi valioso tiempo. –

+1

FYI, funciona solo para Tablet, he probado lo mismo pero siempre muestra la aplicación en modo retrato de forma predeterminada, es decir, no funciona en el teléfono –

+2

sensorLandscape se agregó a Froyo (2.2) por lo que funcionará en cualquier dispositivo que tenga eso o luego. – CaseyB

0

El buen método es usar

setRequestedOrientation(6); 

6 es el valor de sensorLandscape pero parece de que no existe una constante definida por él.

9

Otros han mencionado sensorLandscape ... para hacer esto mediante programación en su actividad (o una actividad de base), se puede configurar la orientación a que:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 

lo estoy haciendo en onResume(). Esto respetará el paisaje y el paisaje inverso cuando gires el dispositivo 180 grados en el medio de la actividad, sin tener que usar .

Esto fue útil para mí ya que para las tabletas necesito paisaje/paisaje inverso solamente, y para teléfonos necesito retrato/retrato en reversa solamente, y no quiero hacer dos archivos AndroidManifest por separado. ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT también existe.

Cuestiones relacionadas