2011-10-07 8 views
14

Quiero que mi actividad esté disponible solo en los dos modos de retrato: retrato y reversoPortrait. ¿Cómo puedo conseguir esto? Cuando configuro android:screenOrientation="portrait" forzará que la actividad sea solo en retrato normal, viceversa con reversePortrait.Actividad en retrato reverso o retrospectivo solo

Por favor, no me diga que es un mal enfoque para forzar/bloquear la orientación. Lo sé, pero aún el cliente lo está solicitando. Gracias por entender y por cualquier idea.

ACTUALIZACIÓN: API de nivel 11 y superior

+4

No es un mal enfoque de la OMI, algunas aplicaciones/juegos simplemente no va a funcionar justo en ciertas orientaciones. – Ricky

+0

Gracias Ricky, exactamente. Acabo de ver gente discutiendo sobre publicaciones similares, así que quería aclarar que realmente solo necesito un retrato. – Speedy

+0

muchas aplicaciones de comercio electrónico también bloquean la orientación – Killer

Respuesta

37

Si se encuentra en el nivel API 9+, utilice 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

Gracias !!! ¡Debo estar ciego de haber perdido ese valor! Y sí, estoy en API 11+ así que esto funciona perfectamente. – Speedy

+4

Tuve que usar la versión tipográfica "sensorPortait" en la api 15. – Richard

+0

Esto gira la vista correctamente pero no activa ningún evento. Necesito capturar el evento cuando la orientación cambie de normal a vista inversa. ¿Como hacer eso? – StarDust

1

En AndroidManifest.xml:

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

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

puede probar esta :)

+0

Gracias, esta es una buena respuesta, pero como me olvidé de decir que estoy en API 11+ (Honeycomb) la respuesta de alextc es más adecuada para mí y funciona muy bien. Y no sé por qué, pero tengo un error AAPT cuando trato de usar | en screenOrientation, así que no pude usar dos valores sino solo uno :( – Speedy

+12

@xjaphx, android: screenOrientation = "portrait | reversePortrait". Eso no funciona. Aparece el siguiente error: "error: Error: tipos de cadena no permitidos (en 'screenOrientation' con el valor 'portrait | reversePortrait') ". –

+0

@PaulAnnekov No es porque es una enumeración simple, por lo que no puede usar una combinación de valores con" | " –

1

Por el bien de la posteridad, lo uso para la compatibilidad hacia atrás ...

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

uso

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