Forzar el modo de orientación “retrato”

Estoy intentando forzar el modo “retrato” para mi aplicación porque mi aplicación no está diseñada para el modo “paisaje”.

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

 

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, traté de agregar esto en mi archivo de manifiesto:

  

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, sin suerte.

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

Ejemplo:

   

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

Tenga en cuenta que

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

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

Creo que android:screenOrientation="portrait" se puede usar para actividades individuales. Entonces usa ese atributo en la etiqueta como:

  ...  

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 obtendrá una callback del ciclo de vida

entonces, básicamente, lo que sucede en cada actividad cuando se crea el en crear en la clase de aplicación se desencadena 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.

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

  

Al cual cambié (solo agregué android:screenOrientation="portrait" )

  

Esto solucionó las cosas para mí.

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

 android:screenOrientation="portrait" 

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

 android:configChanges="orientation|keyboardHidden" 

también, y funciona

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

Importar debajo de la línea:

 import android.content.pm.ActivityInfo; 

Agregue la línea Abajo justo arriba de setContentView(R.layout.activity_main);

Para el retrato :

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait 

Para Landscap :

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape 

Esto definitivamente funcionará.

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

Según la documentación de Android, también debería incluir screenSize como un posible cambio de configuración.

 android:configChanges="orientation|screenSize" 

Si su aplicación se dirige al nivel API 13 o superior (según lo declarado por los atributos minSdkVersion y targetSdkVersion), también debe declarar la configuración de “tamaño de pantalla”, ya que también cambia cuando un dispositivo cambia entre orientación vertical y paisaje.

Además, si todos incluyen fontScale en sus ejemplos, ¿no deberían considerar también locale , mcc , fontScale , keyboard y otros?

Respuesta corta: no lo hagas

Rediseña tu aplicación para que pueda ejecutarse en modo retrato y paisaje. No existe una IU que no pueda diseñarse para funcionar tanto en retrato como en paisaje; solo desarrolladores perezosos o poco imaginativos.

La razón por la cual es bastante simple. Desea que su aplicación sea utilizable por una audiencia lo más amplia posible en tantos dispositivos diferentes como sea posible. Al forzar una orientación de pantalla en particular, evita que su aplicación se ejecute (de manera útil) en dispositivos que no son compatibles con esa orientación y frustra y aliena a clientes potenciales que prefieren una orientación diferente.

Ejemplo: usted diseña su aplicación para forzar el modo retrato. Un cliente descarga la aplicación en un dispositivo 2 en 1, que utilizan predominantemente 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 le resulte familiar ni cómoda.
Consecuencia 2: el cliente se siente frustrado por el diseño no intuitivo de su aplicación y encuentra una alternativa o abandona completamente la aplicación.

Estoy peleando con esto con una aplicación en este momento y como consumidor y desarrollador, lo odio. Por muy útil que sea la aplicación, por fantásticas que sean las características que ofrece, odio la aplicación porque me obliga a usar una orientación que va en contra de todas las demás formas en que uso mi dispositivo.

No desea que sus clientes odien su aplicación.


Sé que esto no responde directamente a la pregunta, por lo que quiero explicarlo con un poco más de detalle para aquellos que son curiosos.

Hay una tendencia de los desarrolladores a ser realmente buenos escribiendo código y realmente terrible en el diseño. Esta pregunta, aunque suena como una pregunta de código y el asker ciertamente se siente como una pregunta de código, es realmente una cuestión de diseño.

La pregunta realmente es “¿Debo bloquear la orientación de la pantalla en mi aplicación?” El asker eligió diseñar la interfaz de usuario para que funcione y se vea bien solo en modo retrato. 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 de retrato (común para los juegos móviles). Pero esas razones desatienden todos los factores realmente importantes que motivan el diseño adecuado.

  1. Compromiso con el cliente: desea que sus clientes se sientan atraídos por su aplicación, y que no se sientan excluidos de ella. La aplicación debe realizar una transición sin inconvenientes desde lo 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 debe 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, que se convierte en resentimiento contra su marca).

  3. Conversión del cliente: desea que sus clientes puedan pasar de navegar rápida e fácilmente a interactuar. Este es el objective final de cualquier aplicación, convertir las impresiones en ingresos. (Las aplicaciones que no generan ingresos son una pérdida de tiempo para construir, desde una perspectiva comercial).

Una interfaz de usuario mal diseñada reduce la interacción y la respuesta de los clientes, lo que a la larga reduce los ingresos. En un mundo centrado en dispositivos móviles (y particularmente en el tema de modos de visualización retrato / paisaje), esto explica por qué el diseño web receptivo es tan importante. Walmart Canada introdujo el 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 booston un 101.25% , y un 591.42% de clientes que usan dispositivos Android .

También existe una tendencia de los desarrolladores a enfocarse intensamente en la implementación de una solución en particular (como bloquear la orientación de la pantalla), y la mayoría de los desarrolladores en este sitio estarán encantados de ayudar a implementar esa solución, sin cuestionar si es incluso la mejor solución al problema.

Bloquear la orientación de su pantalla es el equivalente de diseño de la interfaz de usuario de implementar un ciclo do-while. ¿Estás realmente seguro de querer hacerlo de esa manera, o hay una mejor alternativa?

No fuerce su aplicación en un solo modo de visualización. Invierta el tiempo y esfuerzo extra para hacerlo receptivo.