Forzar el modo de orientación "vertical"

298

Estoy tratando de forzar el modo "vertical" para mi aplicación porque mi aplicación no está diseñada para el modo "horizontal".

Después de leer algunos foros, agregué estas líneas en mi archivo de manifiesto:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:screenOrientation="portrait">

Pero no funciona en mi dispositivo (HTC Desire). Cambia de "retrato" a "paisaje", ignorando las líneas del archivo de manifiesto.

Después de leer más foros, intenté agregar esto en mi archivo de manifiesto:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:configChanges="orientation"       
  android:screenOrientation="portrait">

y esta función en mi clase de actividad:

public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

Pero de nuevo, no hubo suerte.

thomaus
fuente

Respuestas:

531

No aplique la orientación al elemento de aplicación , en su lugar, debe aplicar el atributo al elemento de actividad , y también debe establecerlo configChangescomo se indica a continuación.

Ejemplo:

<activity
   android:screenOrientation="portrait"
   android:configChanges="orientation|keyboardHidden">
</activity>

Esto se aplica en el archivo de manifiesto AndroidManifest.xml.

C0deAttack
fuente
26
¿Para qué sirven los configChanges?
Dror
71
@Orchestrator, configChanges significa que el cambio de configuración es manejado por la actividad misma. Sin ella, la actividad se reiniciará si hay un cambio de orientación. Puede preguntar, si ha especificado que la orientación es "vertical", ¿cómo cambiaría alguna vez? Puede cambiar si inicia otra actividad que altera la orientación, luego se cierra esa nueva actividad y regresa a su actividad. Por ejemplo, la intención de captura de imagen predeterminada en el Samsung Galaxy S3 lo hace en ciertas orientaciones.
Gordon McCreight
2
@GordonMcCreight, ¿puede explicar esto con un ejemplo real "Podría preguntar, si ha especificado que la orientación es" vertical ", ¿cómo cambiaría? Puede cambiar si inicia otra actividad que altera la orientación, entonces eso sale de una nueva actividad, volviendo a su actividad ".
Tushar Pandey
3
Claro, @TusharPandey. Si recuerdo correctamente, el único lugar donde esto nos causó dolor fue cuando nuestra actividad lanzó la intención de captura de imagen predeterminada en el Samsung Galaxy S3. Básicamente, solo queríamos tomar una foto y obtener los resultados. Sin embargo, cuando la intención de la cámara regresó, causó un cambio de orientación que borró el estado de nuestra actividad, ya que no creíamos que necesitáramos protegernos contra eso (dado que toda nuestra aplicación solo estaba en orientación "vertical"). Cómo y por qué el Galaxy S3 hace esto está más allá de mi comprensión (ciertamente limitada).
Gordon McCreight
8
¿Por qué se incluye "keyboardHidden"?
gonzobrains
24

Tenga en cuenta que

android:screenOrientation="portrait"     
android:configChanges="orientation|keyboardHidden"

se agrega en el archivo de manifiesto, donde se define la actividad.

Puntero nulo
fuente
13

Creo que android:screenOrientation="portrait"puede usarse para actividades individuales. Entonces use ese atributo en <activity>etiquetas como:

<activity android:name=".<Activity Name>"
    android:label="@string/app_name" 
    android:screenOrientation="portrait">
   ...         
</activity>
Pinki
fuente
13

Si tiene mucha actividad como la mía, en su aplicación O si no desea ingresar el código para cada etiqueta de actividad en manifiesto, puede hacerlo.

en su clase Base de aplicación, recibirá una devolución de llamada del ciclo de vida

así que, básicamente, lo que sucede en cada actividad cuando se crea la creación on on Application Class aquí es el código ...

public class MyApplication extends Application{

@Override
    public void onCreate() {
        super.onCreate();  

  registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle bundle) {
                activity.setRequestedOrientation(
                        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


// for each activity this function is called and so it is set to portrait mode


            }

            @Override
            public void onActivityStarted(Activity activity) {

            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {

            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
}

espero que esto ayude.

Muneef M
fuente
1
Respuesta eficiente! Esta debería ser la respuesta correcta, especialmente para aquellos que están desarrollando aplicaciones complejas que dependen en gran medida de grandes cantidades de actividad.
FEBRYA ASA PERDANA
10

Establezca el modo de fuerza vertical u horizontal , agregue líneas respectivamente

Importar debajo de la línea:

import android.content.pm.ActivityInfo;

Agregar debajo de la línea justo arriba setContentView(R.layout.activity_main);

Para el retrato :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

Para paisajismo :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

Esto definitivamente funcionará.

Parth Patel
fuente
1
Esto falla con Android 9 en algunos dispositivos: la transición de rotación de pantalla es visible por un breve momento, incluso si solo usa RETRATO
Igor Wojda
¿Puede especificar la información del dispositivo en el que se enfrenta esto, si es posible
Parth Patel
4

Según la documentación de Android, a menudo también debe incluir screenSizecomo posible cambio de configuración.

android:configChanges="orientation|screenSize"

Si su aplicación se dirige al nivel 13 o superior de la API (según lo declarado por los atributos minSdkVersion y targetSdkVersion), también debe declarar la configuración "screenSize", porque también cambia cuando un dispositivo cambia entre las orientaciones vertical y horizontal.

Además, si todos incluyen el valor keyboardHiddenen sus ejemplos, ¿no debería también considerar a continuación locale, mcc, fontScale, keyboardy otros? ..

Martynas
fuente
3

Tenía esta línea en mi AndroidManifest.xml

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:theme="@android:style/Theme.Black.NoTitleBar">

Lo cual cambié a (recién agregado android:screenOrientation="portrait")

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Black.NoTitleBar">

Esto me arregló las cosas.

Ian Jamieson
fuente
2

Algo para complementar: he actualizado una aplicación recientemente, la anterior funcionaba tanto en modo horizontal como vertical, y quiero que la versión actualizada funcione en modo vertical, así que agregué

android:screenOrientation="portrait"

a la actividad correspondiente, y simplemente se bloqueó cuando probé la actualización. Entonces agregué

android:configChanges="orientation|keyboardHidden"

También, y funciona.

usuario2819453
fuente
1
Si esta no es una respuesta a la pregunta, puede agregarla como comentario ayudaría.
JPReddy
Compruebe que ha agregado a la actividad no para bloque de aplicación
Waran-
1

Creo que quieres agregar android:configChanges="orientation|keyboardHidden"a tu actividad? De lo contrario, la actividad se reinicia en config-change. El onConfigurationChangedno se llamaría entonces, solo elonCreate

Nanne
fuente
1

Si desea admitir diferentes orientaciones debugy releasecompilaciones, escríbalo (consulte https://developer.android.com/studio/build/gradle-tips#share-properties-with-the-manifest ).

En build.gradlesu appcarpeta escriba:

android {
    ...
    buildTypes {
        debug {
            applicationIdSuffix '.debug'
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "fullSensor"]
        }
        release {
            debuggable true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "portrait"]
        }
    }
}

Luego AndroidManifest, puede usar esta variable "orientación" en cualquier Activity:

<activity
    android:name=".LoginActivity"
    android:screenOrientation="${orientation}" />

Puedes agregar android:configChanges:

manifestPlaceholders = [configChanges: "", orientation: "fullSensor"]en depuración y manifestPlaceholders = [configChanges: "keyboardHidden|orientation|screenSize", orientation: "portrait"]en liberación,

<activity
    android:name=".LoginActivity"
    android:configChanges="${configChanges}"
    android:screenOrientation="${orientation}" />
CoolMind
fuente
-8

Respuesta corta: no lo hagas.

Rediseñe su aplicación para que pueda ejecutarse tanto en modo vertical como horizontal. No existe una interfaz de usuario que no pueda diseñarse para funcionar tanto en vertical como en horizontal; solo desarrolladores flojos o poco imaginativos.

La razón por la cual es bastante simple. Desea que su aplicación sea utilizable por el mayor público posible en tantos dispositivos diferentes como sea posible. Al forzar una orientación de pantalla en particular, evita que su aplicación se ejecute (usablemente) en dispositivos que no admiten esa orientación y frustra y enajena a los clientes potenciales que prefieren una orientación diferente.

Ejemplo: diseña tu aplicación para forzar el modo vertical. Un cliente descarga la aplicación en un dispositivo 2 en 1 que utiliza principalmente en modo horizontal.
Consecuencia 1: su aplicación no se puede usar, o su cliente se ve obligado a desacoplar su dispositivo, rotarlo y usarlo en una orientación que no les resulta familiar o cómoda.
Consecuencia 2: el cliente se frustra por el diseño no intuitivo de su aplicación y encuentra una alternativa o abandona la aplicación por completo.

Estoy luchando con esto con una aplicación en este momento y como consumidor y desarrollador, lo odio. Tan útil como es la aplicación, tan fantásticas como son las características que ofrece, odio absolutamente la aplicación porque me obliga a usar una orientación que es contraria a cualquier otra forma en que uso mi dispositivo.

No quiere que sus clientes odien su aplicación.


Sé que esto no responde directamente a la pregunta, así que quiero explicarlo con un poco más de detalle para aquellos que tienen curiosidad.

Hay una tendencia para que los desarrolladores sean realmente buenos escribiendo código y realmente terribles en el diseño. Esta pregunta, aunque suena como una pregunta de código y el autor de la pregunta ciertamente siente que es una pregunta de código, es realmente una pregunta de diseño.

La pregunta realmente es "¿Debo bloquear la orientación de la pantalla en mi aplicación?" El autor de la pregunta eligió diseñar la interfaz de usuario para que funcione y se vea bien solo en modo vertical. Sospecho que fue para ahorrar tiempo de desarrollo o porque el flujo de trabajo de la aplicación es particularmente propicio para un diseño vertical (común para los juegos móviles). Pero esas razones descuidan todos los factores importantes reales que motivan el diseño adecuado.

  1. Compromiso con el cliente: desea que sus clientes se sientan atraídos por su aplicación, no expulsados ​​de ella. La aplicación debe pasar sin problemas de lo que sea que esté haciendo su cliente antes de abrir su aplicación. (Esta es la razón por la cual la mayoría de las plataformas tienen principios de diseño consistentes, por lo que la mayoría de las aplicaciones se parecen más o menos aunque no es necesario).

  2. Respuesta del cliente: desea que sus clientes reaccionen positivamente a su aplicación. Deberían disfrutar de usarlo. Incluso si se trata de una aplicación de nómina para el trabajo, debería ser un placer para ellos abrirla y registrarla. La aplicación debería ahorrarle tiempo a sus clientes y reducir la frustración por las alternativas. (Las aplicaciones que molestan a los usuarios generan resentimiento contra su aplicación, lo que se convierte en resentimiento contra su marca).

  3. Conversión de clientes: desea que sus clientes puedan pasar rápida y fácilmente de la navegación a la interacción. Este es el objetivo final de cualquier aplicación, convertir las impresiones en ingresos. (Las aplicaciones que no generan ingresos son una pérdida de tiempo para crear, desde una perspectiva comercial).

Una interfaz de usuario mal diseñada reduce el compromiso y la respuesta del cliente, lo que finalmente resulta en menores ingresos. En un mundo centrado en los dispositivos móviles (y particularmente en el tema de los modos de visualización vertical / horizontal), esto explica por qué el diseño web receptivo es tan importante. Walmart Canadá introdujo un diseño receptivo en su sitio web en noviembre de 2013 y experimentó un aumento del 20% en la conversión de clientes. O'Neill Clothing implementó un diseño web receptivo y los ingresos de los clientes que usan dispositivos iOS aumentaron 101.25% , y 591.42% de los clientes que usan dispositivos Android .

También existe una tendencia a que los desarrolladores se concentren intensamente en implementar una solución particular (como bloquear la orientación de la pantalla), y la mayoría de los desarrolladores en este sitio estarán muy contentos de ayudar a implementar esa solución, sin cuestionar si eso es lo mejor solución al problema.

Bloquear la orientación de la pantalla es el equivalente de diseño de la interfaz de usuario de implementar un bucle do-while. Eres realmente seguro de que quieres hacerlo de esa manera, o hay una alternativa mejor?

No fuerce su aplicación a un solo modo de visualización. Invierta el tiempo extra y el esfuerzo para que responda.

Thomas
fuente
2
Entiendo y estoy de acuerdo con usted en que es una interfaz de usuario mal diseñada. Pero eso no cambia el hecho de que PUEDE NECESITAR hacerlo, y sin embargo, el marco debe tener esas capacidades, en general. Nunca se sabe cómo serán las futuras aplicaciones y qué se debe hacer, por lo que la pregunta sigue siendo válida.
Z. Khullah
1
Tu no estas equivocado. Creo que mi respuesta fue en parte alimentada por la frustración que tengo con algunas aplicaciones que hacen esto innecesariamente y arruina completamente la experiencia. Diré que el número de casos legítimos para bloquear el modo de visualización es infinitesimalmente pequeño (y aún posible y preferible, pero no dentro del presupuesto). Esto trae a la mente otros problemas; con la codificación cada vez más fácil, hay muchos desarrolladores aficionados que escriben aplicaciones porque conocen el código pero sin aprender cómo hacer la interfaz de usuario o el diseño, o incluso las mejores prácticas básicas (aplicaciones Java que se instalan en \ AppData - EWWWW).
Thomas
1
Estoy construyendo una aplicación de realidad virtual. La orientación DEBE SER un paisaje para que las gafas hagan su magia. Ese es un ejemplo de una interfaz de usuario que no puede diseñarse para funcionar tanto en vertical como en horizontal. Los juegos también pueden tener que forzar una cierta orientación. Apuesto a que hay toneladas de casos legítimos.
Raslanove
1
Si bien StackExchange existe para responder preguntas específicas, las respuestas deben escribirse para que se apliquen de la manera más general posible para que esas respuestas sean útiles para otros. El desarrollo es mucho más que escribir código y la razón por la que hay tantas aplicaciones basura en el mundo es porque muchos desarrolladores olvidan, o nunca aprenden, este importante principio. Personalmente, agregaría que si está haciendo realidad virtual en un teléfono, está haciendo mal la realidad virtual, pero el costo ha empujado la demanda de realidad virtual a plataformas que nunca deberían ser compatibles.
Thomas
1
No estoy en desacuerdo con esta respuesta, pero responde una pregunta que no se hizo.
bmovement