¿Cómo configurar toda la aplicación solo en modo vertical?

201

¿Cómo lo configuro para que la aplicación se ejecute solo en modo vertical? Quiero que se desactive el modo horizontal mientras se ejecuta la aplicación. ¿Cómo lo hago programáticamente?

naresh
fuente

Respuestas:

293

Para cualquier versión de Android

De XML

Puede especificar android:screenOrientation="portrait"para cada actividad en su archivo manifest.xml. No puede especificar esta opción en la applicationetiqueta.

De Java

Otra opción es hacerlo mediante programación, por ejemplo en una Activityclase base:

@Override
public void onCreate(Bundle savedInstanceState) {
  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

Para Android 4+ (API 14+)

La última opción es hacerlo con los oyentes del ciclo de vida de la actividad, que solo está disponible desde Android 4.0 (API 14+). Todo sucede en una Applicationclase personalizada :

@Override
public void onCreate() {
    super.onCreate();  
    registerActivityLifecycleCallbacks(new ActivityLifecycleAdapter() {
        @Override
        public void onActivityCreated(Activity a, Bundle savedInstanceState) {
            a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    });
}

ActivityLifecycleAdapteres solo una clase auxiliar que necesitará crear, que será una implementación vacía de ActivityLifecycleCallbacks(para que no tenga que anular todos y cada uno de los métodos de esa interfaz cuando simplemente necesita uno de ellos).

Vincent Mimoun-Prat
fuente
1
no está trabajando. pasa al modo horizontal cuando encendí el dispositivo. y más cosas en el código estoy usando estos setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_SENSOR); instrucciones para la barra de progreso. ¿Hay algún problema con estas instrucciones?
naresh
esta funcionando. Una cosa más no ponga más de dos instrucciones en su parte de codificación. significa que habilita al sensor para cambiar la orientación de la pantalla.
naresh
3
-1: El autor de la pregunta solicitó específicamente cómo hacerlo // programáticamente //, y para toda la aplicación (lo que me lleva a creer que no quieren hacerlo para cada actividad individualmente).
jwir3
@ jwir3, no estoy de acuerdo. "programación" no es solo escribir código de código, también son todos los meta archivos, recursos que usa, el trabajo en torno a las idiosincrasias del IDE, etc. Esta es una buena respuesta, soluciona el problema y el OP lo marcó como correcto. aparentemente una respuesta suficiente para la pregunta original.
James Webster
9
Al usar el método LifeCycleCallbacks, se retrasará el inicio de la actividad cuando sostenga su dispositivo en el modo horizontal (lo que normalmente sería). Supongo que es porque los dispositivos vuelven brevemente al modo horizontal entre las actividades y necesitan tiempo para manejar esto. Establecer la orientación en manifiesto no tiene este efecto.
Anónimo
142

Sí, puede hacer esto tanto programáticamente como para todas sus actividades haciendo una actividad abstracta que extienda todas sus actividades.

public abstract class AbstractActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
}

Esta actividad abstracta también se puede utilizar para un menú global.

Jan-Terje Sørensen
fuente
3
Nota: creo que esa ActivityInfo.SCREEN_ORIENTATION_NOSENSORdebería ser la mejor respuesta porque está destinado a dejar el dispositivo en el estado predeterminado porque algunos dispositivos no tienen una orientación vertical. Sin embargo, 'nosensor' NO funciona para mí, por lo que la respuesta de @ arcone me representa.
David Manpearl
104

Puede hacer esto para toda su aplicación sin tener que hacer que todas sus actividades extiendan una clase base común.

El truco es primero asegurarse de incluir una Applicationsubclase en su proyecto. En su onCreate(), llamado cuando su aplicación se inicia por primera vez, registra unActivityLifecycleCallbacks objeto (nivel API 14+) para recibir notificaciones de eventos del ciclo de vida de la actividad.

Esto le brinda la oportunidad de ejecutar su propio código cada vez que se inicia cualquier actividad en su aplicación (o se detiene, se reanuda o lo que sea). En este punto, puede llamar setRequestedOrientation()a la actividad recién creada.

class MyApp extends Application {

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

        // register to be informed of activities starting up
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {

            @Override
            public void onActivityCreated(Activity activity, 
                                          Bundle savedInstanceState) {

                // new activity created; force its orientation to portrait
                activity.setRequestedOrientation(
                    ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

            }

            ....

        });

    }
}
Graham Borland
fuente
9
Esta es la única respuesta que aborda la pregunta. Una línea para gobernarlos a todos.
Samuel
2
* Una clase para gobernarlos a todos.
Jay Mayu
3
y nunca olvides agregar la raíz de la aplicación de manifiesto. android: name = ". MyApp"
Faisal Naseer
2
Este enfoque llama al onCreate () de la actividad dos veces.
Sandeep R
3
El problema es que cuando sostiene el dispositivo horizontalmente y comienza una nueva actividad, aparece en orientación horizontal y luego gira a vertical. Parece que la única buena manera de bloquear la aplicación completa en orientación vertical es marcar cada actividad en Manifiesto.
Den
42

Puede configurar esto en su archivo de manifiesto.

android:name=".your launching activity name"
android:screenOrientation="portrait"

y también puede lograr lo mismo escribiendo el código en su archivo de clase como:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
SRam
fuente
1
@ Naresh pls aceptamos ans si u tiene cualquier solución de acuerdo a su necesidad será la raza de su calificación también
SRAM
24

Agregue android: screenOrientation = "portrait" a la actividad en AndroidManifest.xml. Por ejemplo:

<activity android:name=".SomeActivity"
    android:label="@string/app_name"
    android:screenOrientation="portrait">
Nikunj Patel
fuente
25
Dijo APLICACIÓN no actividad.
Reinherd
10

Utilizar:

android:screenOrientation="portrait" 

Simplemente escriba esta línea en el archivo de manifiesto de su aplicación en cada actividad que desee mostrar solo en modo vertical.

Deepak Sharma
fuente
8

Escriba esto en su archivo de manifiesto, para cada actividad:

android:screenOrientation="portrait" 
Zwiebel
fuente
2

A partir de la guía para desarrolladores de Android:

"orientación" La orientación de la pantalla ha cambiado: el usuario ha girado el dispositivo. Nota: Si su aplicación se dirige a la API de nivel 13 o superior (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.

"screenSize" El tamaño de pantalla disponible actual ha cambiado. Esto representa un cambio en el tamaño disponible actualmente, en relación con la relación de aspecto actual, por lo que cambiará cuando el usuario cambie entre horizontal y vertical. Sin embargo, si su aplicación se dirige al nivel de API 12 o inferior, entonces su actividad siempre maneja este cambio de configuración en sí mismo (este cambio de configuración no reinicia su actividad, incluso cuando se ejecuta en un dispositivo Android 3.2 o superior). Agregado en API nivel 13.

Entonces, en el archivo AndroidManifest.xml, podemos poner:

<activity
            android:name=".activities.role_activity.GeneralViewPagerActivity"
            android:label="@string/title_activity_general_view_pager"
            android:screenOrientation="portrait"
            android:configChanges="orientation|keyboardHidden|screenSize"
            >
        </activity> 
super1ha1
fuente
1

Agregando <preference name="orientation" value="portrait" />debajo<widget> de mi config.xml funcionó para mí.

(Las otras soluciones no funcionaron en mi dispositivo, se sobrescribieron durante la construcción o dieron errores de desaprobación durante el proceso de construcción).

Philip
fuente
¿Dónde está dicho config.xml? ¿A qué plataforma de desarrollo te refieres?
Tash Pemhiwa
1

en el archivo Manifiesto, qué actividad desea utilizar en "retrato" , debe escribir este código en la etiqueta Actividad

  android:screenOrientation="portrait" 

Me gusta esto

         android:icon="@drawable/icon"
        android:name="com.zemkoapps.hd.wallpaper.AndroidGridLayoutActivity" 
        android:screenOrientation="portrait" >

pero si quieres pantalla en horizontal usa este código como este

android:screenOrientation="landscape"
Bilal Jarral
fuente
1
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    //setting screen orientation locked so it will be acting as potrait
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
}
Emon Hossain Munna
fuente
0

Si alguien se preguntaba, cómo podría hacer esto para toda su aplicación sin tener que hacer que todas sus actividades extiendan una clase base común en Kotlin , vea el siguiente ejemplo:

class InteractiveStoryApplication: Application() {
override fun onCreate() {
    super.onCreate()
    registerActivityLifecycleCallbacks(object: ActivityLifecycleCallbacks {
        override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
            activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
        }

        override fun onActivityPaused(activity: Activity?) {
        }

        override fun onActivityResumed(activity: Activity?) {
        }

        override fun onActivityDestroyed(activity: Activity?) {
        }

        override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
        }

        override fun onActivityStarted(activity: Activity?) {
        }

        override fun onActivityStopped(activity: Activity?) {
        }
    })
}
}

y luego tienes que agregar tu clase base común en AndroidManifest así:

<application android:allowBackup="true"
android:name=".InteractiveStoryApplication"
Ashildr
fuente
0

Puedes hacerlo de dos maneras.

  1. Añadir android:screenOrientation="portrait" su archivo de manifiesto a la actividad correspondiente
  2. Agregue setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); a su actividad en el método `onCreate ()
Saneesh
fuente
0

Similar a la respuesta de Graham Borland ... pero parece que no tiene que crear una clase de Aplicación si no lo desea ... solo cree una Actividad Base en su proyecto

public class BaseActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_base);
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

}

Y extienda esta clase en lugar de AppCompatActivity donde quiera usar el modo Potrait

public class your_activity extends BaseActivity {}
Raktim Bhattacharya
fuente
0

Para usuarios de Xamarin:

Si extiende todas sus actividades a BaseActivitySolo agregue:

this.RequestedOrientation = ScreenOrientation.Portrait;

Esto resolverá el problema. Si desea que alguna actividad en particular esté en paisaje, anule esto OnActivityCreated. Como:

this.Activity.RequestedOrientation = ScreenOrientation.Landscape;
Nawin
fuente
-11

En su Manifiesto, escriba esto:

<activity
    android:screenOrientation="portrait"
    <!--- Rest of your application information ---!>
</activity>
Tyce Gates
fuente
66
Esto no agrega nada nuevo que las respuestas de 3 años aún no hayan dicho. Puede considerar eliminarlo. Si decide editar su respuesta para incluir más información que distinga su respuesta de los demás, por favor, responda a mí.
Artjom B.
1
android: screenOrientation = "portrait" no se puede agregar a la etiqueta de la aplicación, debe ir dentro de la etiqueta de actividad
Hossein Amini