Come disabilitare la modalità orizzontale in Android?


Risposte:


1633

Aggiungi android:screenOrientation="portrait"all'attività in AndroidManifest.xml. Per esempio:

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

EDIT: Dal momento che questa è diventata una risposta molto popolare, mi sento in colpa perché forzare il ritratto è raramente la soluzione giusta ai problemi a cui viene frequentemente applicato.
I principali avvertimenti con ritratto forzato:

  • Questo non ti assolve dal dover pensare agli eventi del ciclo di vita delle attività o al corretto salvataggio / ripristino dello stato. Ci sono molte altre cose oltre alla rotazione delle app che possono innescare una distruzione / ricreazione di attività, tra cui cose inevitabili come il multitasking. Non ci sono scorciatoie; imparare a usare fasci e retainInstanceframmenti.
  • Tieni presente che a differenza dell'esperienza iPhone abbastanza uniforme, ci sono alcuni dispositivi in ​​cui il ritratto non è l'orientamento chiaramente popolare. Quando gli utenti sono su dispositivi con tastiere hardware o game pad su Nvidia Shield, su Chromebook , su pieghevoli o su Samsung DeX , forzare il ritratto può rendere l'esperienza della tua app limitante o una seccatura enorme di usabilità. Se la tua app non ha un forte argomento UX che porterebbe a un'esperienza negativa per il supporto di altri orientamenti, probabilmente non dovresti forzare il panorama. Sto parlando di cose come "questa è un'app di registratore di cassa per un modello specifico di tablet sempre utilizzato in un dock hardware fisso".

Quindi la maggior parte delle app dovrebbe lasciare che i sensori del telefono, il software e la configurazione fisica prendano la propria decisione su come l'utente desidera interagire con la tua app. Alcuni casi a cui potresti voler pensare, tuttavia, se non sei soddisfatto del comportamento predefinito sensordell'orientamento nel tuo caso d'uso:

  • Se la tua preoccupazione principale è che l'orientamento accidentale cambia a metà dell'attività che pensi che i sensori e il software del dispositivo non faranno bene (ad esempio, in un gioco basato sull'inclinazione), considera di supportare il paesaggio e il ritratto, ma utilizzali nosensorper l'orientamento. Questo costringe il panorama sulla maggior parte dei tablet e in verticale sulla maggior parte dei telefoni, ma ancora non lo consiglierei per la maggior parte delle app "normali" (ad alcuni utenti piace solo digitare la softkey orizzontale sui loro telefoni e molti utenti di tablet leggono in verticale - e dovresti lasciarli).
  • Se hai ancora bisogno di forzare il ritratto per qualche motivo, sensorPortraitpotrebbe essere migliore rispetto portraitad Android 2.3+; questo consente un ritratto capovolto, che è abbastanza comune nell'uso dei tablet.

54
È possibile farlo per l'intera app. Dai
Liam George Betsworth,

1
Ho notato che c'è un altro ritratto: sensorPortait. Qual è la differenza tra sensorPortait e ritratto?
Jacky

1
Se leggi i documenti di Google : "Orientamento verticale, ma può essere normale o invertito in base al sensore del dispositivo. Aggiunto nel livello API 9." Quindi - cioè - "ritratto, lato destro capovolto o capovolto, solo Android 2.3+".
Yoni Samlan,

2
Come ho notato nella mia risposta di seguito - per ovviare a diversi problemi, "nosensor" è probabilmente un'opzione migliore.
Mike Weir,

1
Devo dire che non sono d'accordo. Non tutte le esperienze sono compatibili con la modalità orizzontale sui telefoni, quindi dovresti lasciare decidere all'UX, non ai sensori. Questo non è il caso dei tablet.
Renzo Tissoni,

110

Non ero a conoscenza del AndroidManifest.xmlcambio di file fino alla lettura di questo post, quindi nelle mie app l'ho usato invece:

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);     //  Fixed Portrait orientation

9
questo può far saltare la tua attività al primo caricamento se il dispositivo non è nell'orientamento specificato.
Dori,

Stavo usando questo metodo, lo stavo chiamando in OnCreate quindi avrei letto i dati da alcuni file di risorse. Se avessi avviato l'app con un dispositivo con orientamento orizzontale, ruoterebbe ma ciò comporterebbe la lettura errata di tali risorse di inizializzazione, per qualche strano motivo (forse dovrei aspettare che la rotazione finisca in qualche modo). L'uso dell'alternativa XML non ha causato questo problema.
Radu Simionescu,

1
Questo potrebbe essere un problema con la sequenza di avvio per i programmi Android. Potresti provare a spostare setRequestedOrientation () su onResume () ???
Ricco

45

Aggiungi questo android:screenOrientation="portrait"nel tuo file manifest in cui dichiari la tua attività in questo modo

<activity android:name=".yourActivity"
    ....
    android:screenOrientation="portrait" />

Se vuoi usare il codice java, prova

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

prima di chiamare il setContentViewmetodo per la tua attività in onCreate().

Spero che questo aiuto e facilmente comprensibile per tutti ...


29

Molte delle risposte qui suggeriscono di usare "portrait"nel tuo file AndroidManifest.xml. Questa potrebbe sembrare una buona soluzione, ma come notato nella documentazione, stai individuando dispositivi che potrebbero avere solo un panorama. Stai anche forzando alcuni dispositivi (che funzionano meglio in orizzontale) per andare in verticale, senza ottenere l'orientamento corretto.

Il mio suggerimento è di utilizzare "nosensor"invece. Ciò lascerà il dispositivo a utilizzare il suo orientamento preferito predefinito, non bloccherà alcun acquisto / download su Google Play e garantirà che il sensore non rovini il tuo gioco (nel mio caso NDK).


Dato che molti lo stanno votando, vorrei sottolineare che da allora ho scelto altre risposte che suggeriscono "ritratto" poiché alcuni dispositivi oscuri in realtà rispondono in modo imprevedibile quando vogliono implementare la rotazione dello schermo in-app, che è diventata un requisito più tardi per me. Dubito inoltre che qualsiasi app con "ritratto" verrebbe bloccata da qualsiasi configurazione di Google Play.
Mike Weir,

Google Play, infatti, filtra le app solo ritratto su dispositivi solo orizzontale, vedere la nota in questa pagina: developer.android.com/guide/topics/manifest/… ("il valore che dichiari abilita il filtraggio per servizi come Google Riproduci ")
miracle2k,

14

Se vuoi le impostazioni utente,

allora consiglierei setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

È possibile modificare le impostazioni da un menu delle impostazioni.

Lo richiedo perché i miei timer devono corrispondere a ciò che è sullo schermo e la rotazione dello schermo distruggerà l'attività corrente.


14

Aggiungi Like this Line in Your Manifest

Android: screenOrientation = "ritratto"

<manifest
    package="com.example.speedtest"
    android:versionCode="1"
    android:versionName="1.0" >

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >


        <activity
            android:name="ComparisionActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
        </activity>

    </application>

</manifest>   

9

Puoi farlo per l'intera applicazione senza dover estendere tutte le tue attività a una classe base comune.

Il trucco è innanzitutto assicurarsi di includere una sottoclasse dell'applicazione nel progetto. Nel suo onCreate (), chiamato quando la tua app viene avviata per la prima volta, registri un oggetto ActivityLifecycleCallbacks (livello API 14+) per ricevere notifiche sugli eventi del ciclo di vita delle attività.

Ciò ti dà la possibilità di eseguire il tuo codice ogni volta che viene avviata (o interrotta, ripresa o ripresa) qualsiasi attività nella tua app. A questo punto puoi chiamare setRequestedOrientation () sull'attività appena creata.

E non dimenticare di aggiungere l'app: name = ". MyApp" nel tuo file manifest.

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);
            }
            ....
        });
    }
}

7

Usalo in onCreate () dell'Attività

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

7

È necessario modificare android:screenOrientation="sensorPortrait"in AndroidManifest.xml


6

Aggiungi questo attributo nel tag attività.

 android:screenOrientation="portrait"

6

Se non vuoi passare attraverso la seccatura di aggiungere meglio l'orientamento in ciascuna voce manifest dell'attività, crea una classe BaseActivity (eredita 'Activity' o 'AppCompatActivity') che sarà ereditata da ogni attività della tua applicazione anziché da 'Activity 'o' AppCompatActivity 'e aggiungi semplicemente il seguente pezzo di codice in BaseActivity:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    // rest of your code......
}

5

Aggiungi android:screenOrientation="portrait"all'attività che desideri disabilitare la modalità orizzontale.


5

Se vuoi disabilitare Landscape mode for your android app(o una singola attività) devi solo aggiungere,

android:screenOrientation="portrait"al tag attività nel AndroidManifest.xmlfile.

Piace:

<activity android:name="YourActivityName" 
    android:icon="@drawable/ic_launcher" 
    android:label="Your App Name" 
    android:screenOrientation="portrait">

Un altro modo, approccio programmatico.

Se vuoi farlo programmaticamente, ad es. usando il codice Java. È possibile farlo aggiungendo il codice seguente nella classe Java dell'attività che non si desidera visualizzare in modalità orizzontale.

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Spero che ti aiuti. Per maggiori dettagli puoi visitare qui inserisci la descrizione del link qui


2
Poiché così tante risposte danno consigli che contraddicono i buoni consigli di @Phoenix e @Yoni, penso che una buona linea di fondo sia quella di ribadire ciò che suggeriscono:android:screenOrientation="nosensor">
DSlomer64,

1
@ DSlomer64 Sì. Se vuoi far fronte ai dispositivi tablet, allora dovresti usare il valore nosensore invece ritratto
IntelliJ Amiya

5

Come modificare l'orientamento in alcune viste

Invece di bloccare l'orientamento dell'intera attività è possibile utilizzare questa classe per bloccare in modo pragmatico l'orientamento da qualsiasi vista in modo pragmatico: -

Fai la tua vista Orizzontale

OrientationUtils.lockOrientationLandscape(mActivity);

Rendi la tua vista verticale

OrientationUtils.lockOrientationPortrait(mActivity);

Sblocca orientamento

OrientationUtils.unlockOrientation(mActivity);

Classe di orientamento

import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Build;
import android.view.Surface;
import android.view.WindowManager;

/*  * This class is used to lock orientation of android app in nay android devices 
 */

public class OrientationUtils {
    private OrientationUtils() {
    }

    /** Locks the device window in landscape mode. */
    public static void lockOrientationLandscape(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
    }

    /** Locks the device window in portrait mode. */
    public static void lockOrientationPortrait(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }

    /** Locks the device window in actual screen mode. */
    public static void lockOrientation(Activity activity) {
        final int orientation = activity.getResources().getConfiguration().orientation;
        final int rotation = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()
                .getRotation();

        // Copied from Android docs, since we don't have these values in Froyo
        // 2.2
        int SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8;
        int SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9;

        // Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO
        if (!(Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO)) {
            SCREEN_ORIENTATION_REVERSE_LANDSCAPE = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            SCREEN_ORIENTATION_REVERSE_PORTRAIT = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
        }

        if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90) {
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            }
        } else if (rotation == Surface.ROTATION_180 || rotation == Surface.ROTATION_270) {
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_PORTRAIT);
            } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
            }
        }
    }

    /** Unlocks the device window in user defined screen mode. */
    public static void unlockOrientation(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
    }

}

4

uso

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

4

È necessario impostare l'orientamento di ciascuna attività.

<activity
                android:name="com.example.SplashScreen2"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.Registration"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.Verification"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.WelcomeAlmostDone"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>
            <activity
                android:name="com.example.PasswordRegistration"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Black.NoTitleBar" >
            </activity>

4

aggiungi classe all'interno del metodo oncreate ()

 setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

4

Se si utilizza Xamarin C # alcune di queste soluzioni non funzioneranno. Ecco la soluzione che ho trovato funzionare.

[Activity(MainLauncher = true, Icon = "@drawable/icon", ScreenOrientation = ScreenOrientation.Portrait)]

Al di sopra della classe funziona bene, simile alle altre soluzioni, anche non applicabile a livello globale e deve essere inserito in ogni intestazione di attività.


4

Puoi forzare la tua particolare attività a rimanere sempre in modalità ritratto scrivendo questo nel tuo manifest.xml

 <activity android:name=".MainActivity"
        android:screenOrientation="portrait"></activity>

Puoi anche forzare la tua attività a rimanere in modalità postrait scrivendo la seguente riga nel metodo onCreate () della tua attività

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

}

3
<android . . . >
    . . .
    <manifest . . . >
        . . .
        <application>
            <activity android:name=".MyActivity" 
                android:screenOrientation="portrait" 
                android:configChanges="keyboardHidden|orientation">
            </activity>
        </application>
    </manifest>
</android>

3

Aggiungi di seguito encomia il tuo progetto,

npm install

npm reagisco-nativo-orientamento-armadietto

quindi usi la classe manifest come, React_Native (cartella del tuo progetto) / android / app / src / main / AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

<application
  android:name=".MainApplication"
  android:label="@string/app_name"
  android:icon="@mipmap/ic_launcher"
  android:allowBackup="false"
  android:theme="@style/AppTheme">
  <activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:screenOrientation="landscape"
    android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
    android:windowSoftInputMode="adjustResize">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
  </activity>
  <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>

Grazie!


2

Nella <apphome>/platform/androiddirectory creata AndroidManifest.xml(copiandola da quella generata). Quindi aggiungere android:screenOrientation=" portrait" a TUTTI gli elementi dell'attività.


2
 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="in.co.nurture.bajajfinserv">
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>


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

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

possiamo limitare l'attività in modalità verticale o orizzontale utilizzando l'attributo o android: screenOrientation.

se abbiamo più di un'attività nel mio programma, allora hai la libertà di limitare qualsiasi attività in una qualsiasi modalità e ciò non avrà mai effetto sulle altre che non vuoi.


2

O in classe manifest.

<activity android:name=".yourActivity"
    ....
    android:screenOrientation="portrait" />

o programmaticamente

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

Nota: dovresti chiamare questo setContentViewmetodo prima della tua attività in onCreate().


2

Aggiungi android:screenOrientation="portrait"nel file AndroidManifest.xml .

Per esempio :

<activity android:name=".MapScreen" 
 android:screenOrientation="portrait"></activity>

1

Nella speranza di aiutare qualcun altro, il seguente attributo su ACTIVITY in AndroidManifest.xml è tutto ciò che serve:

android: configChanges = "orientamento"

Quindi, nodo di attività completo:

<activity android:name="Activity1" 
    android:icon="@drawable/icon" 
    android:label="App Name" 
    android:configChanges="orientation">

Rimangono così tante risposte, dovresti fornire maggiori informazioni, perché dovresti usare le tue. Soprattutto i documenti dicono che non sta usando questa opzione: "Nota: l'uso di questo attributo dovrebbe essere evitato e usato solo come ultima risorsa. Per ulteriori informazioni su come gestire correttamente un riavvio a causa di una modifica della configurazione, leggi Gestione delle modifiche di runtime." developer.android.com/guide/topics/manifest/…
Murmel,

1

In kotlin lo stesso può essere programmaticamente raggiunto usando di seguito

requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

1

Ha funzionato per me, prova ad aggiungere questo codice nel file AndroidManifest

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme">
        ....
        ....
        </application>

Sarei stata un'ottima soluzione, in quanto non è necessario impostare per attività. Sfortunatamente, non funziona nella mia app.
Myroslav Kolodii,

1

Mettilo nel tuo manifest.

<activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="sensorPortrait" />

L'orientamento sarà verticale, ma se il telefono dell'utente è capovolto, mostra anche il modo corretto. (Quindi lo schermo ruoterà di 180 gradi).


Il sistema ignora questo attributo se l'attività è in esecuzione in modalità multifinestra .


0

se la tua attività è correlata al primo stato di orientamento del dispositivo, ottieni l'orientamento attuale del dispositivo nel onCreatemetodo e correggilo per sempre:

        int deviceRotation = ((WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();

        if(deviceRotation == Surface.ROTATION_0) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
        else if(deviceRotation == Surface.ROTATION_180)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
        }
        else if(deviceRotation == Surface.ROTATION_90)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
        else if(deviceRotation == Surface.ROTATION_270)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
        }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.