Pregunta

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

Después de leer algunos foros, agregué estas líneas en mi archivo 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" lo "paisaje", ignorando las líneas del archivo manifiesto.

Después de una lectura de más foros, intenté agregar esto en mi archivo 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 hay suerte.

¿Fue útil?

Solución

No aplique la orientación al solicitud elemento, en su lugar, debe aplicar el atributo al actividad elemento, y también debes establecer configChanges Como se señaló a continuación.

Ejemplo:

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

Esto se aplica en el archivo manifiesto AndroidManifest.xml.

Otros consejos

Tenga en cuenta que

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

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

pienso android:screenOrientation="portrait" se puede utilizar para actividades individuales. Así que usa ese atributo en <activity> Etiqueta como:

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

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 Manifest, puede hacerlo.

En su clase base de aplicación, obtendrá una devolución de llamada del ciclo de vida

Entonces, básicamente, lo que sucede en cada actividad al crear la clase de creación en la aplicación.

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.

Establecer Modo de retrato o paisaje de fuerza, 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 Retrato:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

Para Paisajismo:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

Esto definitivamente funcionará.

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

android:configChanges="orientation|screenSize"

Si su aplicación se dirige a API nivel 13 o superior (como lo declaran los atributos MinSDKVersion y TargetSDKVersion), también debe declarar la configuración de "pantalla de pantalla", ya que también cambia cuando un dispositivo cambia entre las orientaciones de retrato y paisaje.

Además, si todos incluyen valor keyboardHidden En sus ejemplos, ¿no debería considerar también locale, mcc, fontScale, keyboard ¿y otros?..

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">

A la que cambié (acabo de agregar 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 arregló cosas para mí.

Algo para complementar: He actualizado una aplicación recientemente, el anterior estaba trabajando tanto en el modo de paisaje como en el retrato, y quiero que la versión actualizada debería funcionar en modo de retrato, 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.

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

Si desea apoyar diferentes orientaciones en debug y release construye, escriba así (ver https://developer.android.com/studio/build/gradle-tips#share-properties-with-the-manifest).

En build.gradle de tu app Carpeta Escribir:

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 en AndroidManifest Puede usar esta "orientación" variable en cualquier Activity:

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

Puedes añadir android:configChanges:

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

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

Respuesta corta: No lo hagas.

Rediseñe su aplicación para que pueda ejecutarse en modo de retrato y paisaje. No existe una interfaz de usuario que no se pueda diseñar 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 frenable) en dispositivos que no admiten esa orientación y frustra y alienan a los clientes potenciales que prefieren una orientación diferente.

Ejemplo: diseña su aplicación para forzar el modo de retrato. Un cliente descarga la aplicación en un dispositivo 2 en 1 que usa predominantemente en modo de paisaje.
Consecuencia 1: Su aplicación es inutilizable, o su cliente se ve obligado a desacreditar su dispositivo, rotarlo y usarla en una orientación que no sea familiar o cómoda para ellos.
Consecuencia 2: El cliente se siente frustrado 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. Por útil que sea la aplicación, por fantástica que las características son que ofrece, odio absolutamente la aplicación porque me obliga a usar una orientación que sea contraria a cualquier otra forma en que uso mi dispositivo.

No quieres que tus clientes odien tu aplicación.


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

Hay una tendencia a los desarrolladores a ser realmente buenos para escribir código y realmente terrible en el diseño. Esta pregunta, aunque suena como una pregunta de código y el Asker ciertamente parece 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 solicitante eligió diseñar la interfaz de usuario para funcionar y verse bien solo en modo de retrato. Sospecho que era ahorrar tiempo de desarrollo o porque el flujo de trabajo de la aplicación es particularmente propicio para un diseño de retratos (común para los juegos móviles). Pero esas razones descuidan todos los factores importantes reales que motivan el diseño adecuado.

  1. Compromiso del cliente: desea que sus clientes se sientan atraídos por su aplicación, no lo empujen. La aplicación debe hacer la transición sin problemas de lo que su cliente estuviera haciendo antes de abrir su aplicación. (Esta es la razón por la que la mayoría de las plataformas tienen principios de diseño consistentes, por lo que la mayoría de las aplicaciones se ven más o menos parecidas, aunque no tienen que hacerlo).

  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 registrar. La aplicación debe ahorrar tiempo a sus clientes y reducir la frustración sobre las alternativas. (Aplicaciones que molestan a los usuarios generan resentimiento contra su aplicación que se vuelve en el resentimiento contra su marca).

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

Una IU mal diseñada reduce la participación y la respuesta del cliente, lo que finalmente resulta en ingresos más bajos. En un mundo centrado en el móvil (y particularmente sobre el tema de los modos de exhibición de retratos/paisajes), esto explica por qué el diseño web receptivo es tan importante. Walmart Canada presentó un diseño receptivo en su sitio web en noviembre de 2013 y vio un 20% aumento en la conversión del cliente. La ropa de O'Neill implementó un diseño web receptivo y Los ingresos de los clientes que utilizan dispositivos iOS aumentan 101.25%, y 591.42% De los clientes que usan dispositivos Android.

También hay una tendencia a los desarrolladores a centrarse intensamente en implementar una solución particular (como la orientación de la pantalla de bloqueo), y la mayoría de los desarrolladores en este sitio estarán muy contentos para ayudar a implementar esa solución, sin cuestionar si eso es incluso el mejor solución al problema.

Bloquear la orientación de su pantalla es el equivalente de diseño de la interfaz de usuario para implementar un bucle de hacerlo. Eres De Verdad Seguro que quieres hacerlo de esa manera, ¿o hay una mejor alternativa?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top