Come impostare l'intera applicazione solo in modalità verticale?


201

Come posso impostarlo in modo che l'applicazione funzioni solo in modalità verticale? Voglio che la modalità orizzontale sia disabilitata mentre l'applicazione è in esecuzione. Come lo faccio a livello di codice?

Risposte:


293

Per qualsiasi versione di Android

Da XML

È possibile specificare android:screenOrientation="portrait"per ogni attività nel file manifest.xml. Non è possibile specificare questa opzione suapplication tag.

Da Java

Un'altra opzione è farlo a livello di Activitycodice , ad esempio in una classe base:

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

Per Android 4+ (API 14+)

L'ultima opzione è farlo con i listener del ciclo di vita delle attività, disponibili solo da Android 4.0 (API 14+). Tutto accade in una Applicationclasse personalizzata :

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

ActivityLifecycleAdapterè solo una classe di supporto che dovrai creare, che sarà un'implementazione vuota di ActivityLifecycleCallbacks(quindi non devi sovrascrivere tutti i metodi dell'interfaccia quando ne hai semplicemente bisogno).


1
non funziona. diventa modalità orizzontale quando ho girato il dispositivo. e più cose nel codice sto usando questi setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_SENSOR); istruzioni per la barra di avanzamento. c'è qualche problema con queste istruzioni?
Naresh,

sta funzionando. un'altra cosa non mettere sopra due istruzioni nella parte di codifica. significa che abilita il sensore a cambiare l'orientamento dello schermo.
Naresh,

3
-1: il richiedente ha specificamente richiesto come farlo // a livello di programmazione // e per l'intera applicazione (il che mi porta a credere che non vogliono farlo individualmente per ogni attività).
jwir3,

@ jwir3, non sono d'accordo. "programmazione" non è solo scrivere codice di codice, ma anche tutti i meta file, le risorse che usi, aggirare le idiosincrasie dell'IDE, ecc. Questa è una buona risposta, risolve il problema e l'OP lo ha contrassegnato come corretto così apparentemente una risposta sufficiente per la domanda originale.
James Webster,

9
usando il metodo LifeCycleCallbacks si avrà un ritardo nell'avvio di attività quando si tiene il dispositivo in modalità orizzontale (che sarebbe normalmente). Immagino sia perché i dispositivi tornano brevemente in modalità orizzontale tra le attività e hanno bisogno di tempo per gestirlo. L'impostazione dell'orientamento in manifest non ha questo effetto.
Anonimo il

142

Sì, puoi farlo sia a livello di programmazione che per tutte le tue attività creando un'Attività astratta che estende tutte le tue attività.

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

Questa attività astratta può essere utilizzata anche per un menu globale.


3
Nota: credo che ActivityInfo.SCREEN_ORIENTATION_NOSENSORdovrebbe essere la risposta migliore perché ha lo scopo di lasciare il dispositivo nello stato predefinito perché alcuni dispositivi non hanno un orientamento verticale. Tuttavia, 'nosensor' NON funziona per me, quindi la risposta di @ arcone è valida per me.
David Manpearl,

104

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 Applicationsottoclasse nel progetto. Nel suo onCreate(), chiamato quando la tua app si avvia per la prima volta, registri unActivityLifecycleCallbacks oggetto (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()l'attività appena creata.

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

            }

            ....

        });

    }
}

9
questa è l'unica risposta che affronta la domanda. Una riga per dominarli tutti.
Samuel

2
* Una classe per dominarli tutti.
Jay Mayu,

3
e non dimenticare mai di aggiungere la radice dell'applicazione manifest. android: name = ". MyApp"
Faisal Naseer

2
Questo approccio chiama due volte onCreate () dell'attività.
Sandeep R,

3
Il problema è quando si tiene il dispositivo in orizzontale e si inizia una nuova attività, appare in orientamento orizzontale e quindi ruota in verticale. Sembra che l'unico modo per bloccare l'app completa con l'orientamento verticale sia quello di contrassegnare ogni attività in Manifest.
Den

42

Puoi impostarlo nel tuo file manifest.

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

e puoi anche ottenere lo stesso scrivendo il codice nel tuo file di classe come:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

1
@ naresh pls accetta ans se hai trovato una soluzione in base alle tue esigenze correrà anche la tua valutazione
SRam

24

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

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

25
Ha detto APPLICAZIONE non attività.
Reinherd,

10

Uso:

android:screenOrientation="portrait" 

Basta scrivere questa riga nel file manifest dell'applicazione in ogni attività che si desidera mostrare solo in modalità verticale.


8

Scrivi questo nel tuo file manifest, per ogni attività:

android:screenOrientation="portrait" 

2

A partire dalla guida per sviluppatori Android:

"orientamento" L'orientamento dello schermo è cambiato: l'utente ha ruotato il dispositivo. Nota: se l'applicazione è indirizzata al livello API 13 o superiore (come dichiarato dagli attributi minSdkVersion e targetSdkVersion), è necessario dichiarare anche la configurazione "screenSize", poiché cambia anche quando un dispositivo passa da orientamento verticale a orizzontale.

"screenSize" Le dimensioni dello schermo attualmente disponibili sono cambiate. Ciò rappresenta una modifica delle dimensioni attualmente disponibili, rispetto alle proporzioni correnti, quindi cambierà quando l'utente passa da orizzontale a verticale. Tuttavia, se l'applicazione ha come target API livello 12 o inferiore, la tua attività gestisce sempre questa modifica della configurazione stessa (questa modifica della configurazione non riavvia la tua attività, anche quando è in esecuzione su un dispositivo Android 3.2 o versione successiva). Aggiunto nel livello API 13.

Quindi, nel file AndroidManifest.xml, possiamo mettere:

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

1

Aggiungendo <preference name="orientation" value="portrait" />sotto<widget> nel mio config.xml ha funzionato per me.

(Le altre soluzioni o non hanno funzionato sul mio dispositivo, sono state sovrascritte durante la creazione o hanno dato errori di deprecazione durante il processo di generazione.)


Dov'è detto config.xml? A quale piattaforma di sviluppo ti riferisci?
Tash Pemhiwa,

1

nel file manifest quale attività si desidera utilizzare in "verticale" è necessario scrivere questo codice nel tag Activity

  android:screenOrientation="portrait" 

come questo

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

ma se vuoi lo schermo in orizzontale usa questo codice in questo modo

android:screenOrientation="landscape"

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

0

Se qualcuno si chiedeva come poterlo fare per l'intera applicazione senza dover estendere tutte le attività a una classe base comune in Kotlin , vedere l'esempio seguente:

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?) {
        }
    })
}
}

e quindi devi aggiungere la tua classe base comune in AndroidManifest in questo modo:

<application android:allowBackup="true"
android:name=".InteractiveStoryApplication"

0

Puoi farlo in due modi.

  1. Aggiungi android:screenOrientation="portrait"il tuo file manifest all'attività corrispondente
  2. Aggiungi setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); alla tua attività nel metodo `onCreate ()

0

Simile alla risposta Graham Borland ... ma sembra che non sia necessario creare la classe Application se non si desidera ... basta creare un'attività di base nel progetto

public class BaseActivity extends AppCompatActivity {

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

}

Estendi questa classe invece di AppCompatActivity dove vuoi usare la modalità Potrait

public class your_activity extends BaseActivity {}

0

Per gli utenti Xamarin:

Se estendi tutte le tue attività ad un BaseActivityAggiungi:

this.RequestedOrientation = ScreenOrientation.Portrait;

Questo risolverà il problema. Se si desidera che una determinata attività sia in orizzontale, ignorarla OnActivityCreated. Come:

this.Activity.RequestedOrientation = ScreenOrientation.Landscape;

-11

Nel tuo manifest digitare questo:

<activity
    android:screenOrientation="portrait"
    <!--- Rest of your application information ---!>
</activity>

6
Questo non aggiunge nulla di nuovo che le risposte di 3 anni non hanno già detto. Potresti considerare di eliminarlo. Se decidi di modificare la tua risposta per includere ulteriori informazioni che distinguono la tua risposta dagli altri, per favore @ rispondi a me.
Artjom B.

1
android: screenOrientation = "portrait" non può essere aggiunto al tag dell'applicazione, deve andare all'interno del tag attività
Hossein Amini,
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.