Forzar una actividad de Android para usar siempre el modo horizontal

144

Estoy usando el visor Android VNC en mi HTC G1 . Pero por alguna razón, esa aplicación siempre está en modo horizontal a pesar de que mi G1 está en modo vertical. Dado que el visor Android VNC es de código abierto, me gustaría saber cómo es posible que el código duro de una actividad sea 'horizontal'. Me gustaría cambiarlo para respetar la orientación del teléfono.

hap497
fuente

Respuestas:

188

Mirando el AndroidManifest.xml ( enlace ), en la línea 9:

<activity android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden" android:name="VncCanvasActivity">

Esta línea especifica el screenOrientationpaisaje, pero el autor va más allá al anular cualquier cambio de orientación de la pantalla configChanges="orientation|keyboardHidden". Esto apunta a una función anulada en VncCanvasActivity.java.

Si observa VncCanvasActivity, en la línea 109 se encuentra la función anulada:

@Override
public void onConfigurationChanged(Configuration newConfig) {
  // ignore orientation/keyboard change
  super.onConfigurationChanged(newConfig);
}

El autor específicamente puso un comentario para ignorar cualquier cambio de teclado u orientación.


Si desea cambiar esto, puede volver al archivo AndroidManifest.xml que se muestra arriba y cambiar la línea a:

<activity android:screenOrientation="sensor" android:name="VncCanvasActivity">

Esto debería cambiar el programa para cambiar de vertical a horizontal cuando el usuario gira el dispositivo.

Esto puede funcionar, pero puede estropear la apariencia de la GUI, dependiendo de cómo se creó el diseño. Tendrás que dar cuenta de eso. Además, dependiendo de cómo se codifiquen las actividades, puede observar que cuando se cambia la orientación de la pantalla, los valores que se completaron en cualquier cuadro de entrada desaparecen. Esto también puede tener que ser manejado.

Pulkit Sethi
fuente
3
¿Por qué se configChangesnecesita exactamente el atributo? Parece funcionar en mi teléfono sin teclado sin él ... ¿En qué situaciones la orientación cambiará a vertical si screenOrientation="landscape"omite el configChanges?
Timmmm
¿Cómo forzar una actividad incorporada como la biblioteca de selección de imágenes del sistema solo en horizontal o solo vertical?
Jacky
118

También puede establecer los mismos datos en su código Java.

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Otros valores en ActivityInfo le permitirán volver a configurarlo en retrato controlado por sensor o bloqueado. Personalmente, me gusta configurarlo en algo en el Manifiesto como se sugiere en otra respuesta a esta pregunta y luego cambiarlo más tarde usando la llamada anterior en el SDK de Android si es necesario.

haseman
fuente
@Yegor No siempre. De documentos de Android:If the activity is currently in the foreground or otherwise impacting the screen orientation, the screen will immediately be changed (possibly causing the activity to be restarted)
Chaitanya
40

En mi OnCreate(Bundle), generalmente hago lo siguiente:

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
anwarma
fuente
2
el método de manifiesto en las otras respuestas no parecía funcionar, pero @anwarma suyo sí lo hizo
Anup
31

Puede especificar la orientación de una actividad en el manifiesto. Ver aquí .

<activity android:allowTaskReparenting=["true" | "false"]
...
          android:screenOrientation=["unspecified" | "user" | "behind" |
                                     "landscape" | "portrait" |
                                     "sensor" | "nosensor"]
...
                                       "adjustResize", "adjustPan"] >  
Michael Krauklis
fuente
24

En el manifiesto:

<activity  android:name=".YourActivity"
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize">

En tu actividad:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.your_activity_layout);
avisper
fuente
11

El siguiente es el código que usé para mostrar toda la actividad en modo horizontal:

<activity android:screenOrientation="landscape"
          android:configChanges="orientation|keyboardHidden"
          android:name="abcActivty"/>
Megha
fuente
2
"orientación" Si su aplicación apunta al nivel API 13 o superior, entonces también debe declarar el "tamaño de pantalla"
Mina Fawzy
7

Una solución rápida y simple es para el archivo AndroidManifest.xml, agregue lo siguiente para cada actividad que desee forzar al modo horizontal:

android:screenOrientation="landscape"
joshgoldeneagle
fuente
5

Esto funciona para Xamarin.Android. En OnCreate ()

RequestedOrientation = Android.Content.PM.ScreenOrientation.Landscape;
Adelante
fuente
4

¡¡Eso es!! Mucho tiempo esperando esta solución.

Tengo un viejo problema de Android sobre el inicio doble de una actividad que requería el modo horizontal (mediante programación): setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

Ahora Android hace el modo horizontal al inicio.

AndrewDC
fuente
3

Arslan, ¿por qué quieres forzar la orientación programáticamente, aunque ya hay una forma en manifiesto? <activity android:name=".youractivityName" android:screenOrientation="portrait" />

Luna azul
fuente
No soy el que pregunta, pero ¿tal vez quiere forzarlo programáticamente porque quiere forzarlo en un momento determinado?
Hamzah Malik
1

Hacerlo en código es IMO incorrecto y aún más si lo pones en onCreate. Hágalo en el manifiesto y el "sistema" conoce la orientación desde el inicio de la aplicación. Y este tipo de meta o "guía" de nivel superior DEBE estar en el manifiesto. Si quieres demostrarlo a ti mismo, establece un descanso en la actividad onCreate. Si lo hace en código allí, se llamará dos veces: se inicia en modo vertical y luego se cambia a horizontal. Esto no sucede si lo haces en el manifiesto.

RichieHH
fuente
1
Estoy en desacuerdo. Hacer cualquier cosa en código en lugar de a través de un manifiesto es siempre mi método preferido. Basado en el principio de responsabilidad única, el manifiesto solo debe referirse a las propiedades de nivel de aplicación, permisos y enlaces de API. De hecho, no estoy de acuerdo con que la etiqueta <activity> esté presente en un manifiesto de la aplicación, por lo que nunca la puse allí (y funciona bien). La forma en que se presenta una actividad es obviamente una preocupación de presentación. Su actividad debe ser la única responsable de cómo se presenta, por lo que generalmente pongo toda la lógica de presentación en el código de vista / actividad.
Venir el
0

Para Android 4.0 (Ice Cream Sandwich) y posterior, necesitaba agregar estos, además del landscapevalor.

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"

Usar solo keyboardHidden|orientationaún provocaría pérdidas de memoria y recreación de mis actividades al presionar el botón de encendido.

Peterdk
fuente
¡Alerta de mala práctica! Esto no tiene nada que ver con forzar la actividad en modo horizontal. Siempre debe implementar el almacenamiento y la recreación del estado de su actividad. Ese es el conocimiento básico de desarrollo de Android. No resuelvas eso con esta solución hacky. El sistema siempre puede cerrar la actividad si necesita más memoria.
Roel
@Roel, bueno, es la única forma de evitar que la actividad gire de nuevo a vertical cuando, por ejemplo, gira el dispositivo. Impide que estos cambios de configuración afecten a la actividad.
Peterdk
Perdón por el mensaje un poco gruñón, pero lo probé y no tengo todos estos valores para el modo horizontal. Cuando agrega todos estos valores, significa que maneja los cambios usted mismo en onConfigurationChanged () en lugar de que la actividad se reinicie (¡y debe implementar eso!), Pero si fuerza el diseño del paisaje, no ocurrirá una rotación.
Roel
Hola, algunos de ellos tal vez no sean necesarios, pero omitirlos resultará en problemas de rotación extraños. No puedo probar ahora, pero cuando estaba desarrollando una aplicación que necesitaba estar en el paisaje todo el tiempo, solo usar orientation|screensizeno era suficiente en todos los casos. Volvería a girar automáticamente al retrato.
Peterdk
Estos cambios de configuración también se usan en Google Mobile Ads y otros SDK de anuncios. Ahí es donde los obtuve en ese momento.
Peterdk
0

Use ActivityInfo (android.content.pm.ActivityInfo) en su método onCreate antes de llamar al método setLayout de esta manera

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Yamikani Sita
fuente
0

use solo
herramientas android: screenOrientation = "portrait": ignore = "LockedOrientationActivity"

Vibhu Vikram Singh
fuente
0

Agregar las siguientes líneas en la actividad

Necesitas ingresar en cada actividad

para el paisaje

android:screenOrientation="landscape"
tools:ignore="LockedOrientationActivity"

para retrato

android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity"

Aquí el ejemplo de MainActivity

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="org.thcb.app">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity"
            android:screenOrientation="landscape"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".MainActivity2"
            android:screenOrientation="portrait"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
Chetan
fuente
-25

Presione CTRL+F11para girar la pantalla.

Yann Pascal DEUNGOUE DJOMENI
fuente
3
Ahora quieren saber cómo establecer la orientación predeterminada de una aplicación, no cómo se puede girar la pantalla.
kyle k
CTRL + f12 para emulador.
Lazy