Erzwingen Sie den Orientierungsmodus „Hochformat“

298

Ich versuche, den "Hochformat" -Modus für meine Anwendung zu erzwingen, da meine Anwendung absolut nicht für den "Querformat" -Modus ausgelegt ist.

Nachdem ich einige Foren gelesen hatte, fügte ich diese Zeilen in meine Manifestdatei ein:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:screenOrientation="portrait">

Auf meinem Gerät (HTC Desire) funktioniert es jedoch nicht. Es wechselt von "Hochformat" zu "Querformat" und ignoriert die Zeilen aus der Manifestdatei.

Nachdem ich mehr Foren gelesen hatte, versuchte ich dies in meine Manifestdatei aufzunehmen:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:configChanges="orientation"       
  android:screenOrientation="portrait">

und diese Funktion in meiner Aktivitätsklasse:

public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

Aber wieder kein Glück.

thomaus
quelle

Antworten:

531

Wenden Sie die Ausrichtung nicht auf das Anwendungselement an , sondern wenden Sie das Attribut auf das Aktivitätselement an. Sie müssen dies auch configChangeswie unten angegeben festlegen .

Beispiel:

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

Dies wird in der Manifestdatei angewendet AndroidManifest.xml.

C0deAttack
quelle
26
Wofür sind die configChanges?
Dror
71
@Orchestrator, configChanges bedeutet, dass die Konfigurationsänderung von der Aktivität selbst behandelt wird. Ohne diese Option wird die Aktivität neu gestartet, wenn sich die Ausrichtung ändert. Sie könnten fragen, wenn Sie angegeben haben, dass die Ausrichtung "Porträt" ist, wie würde sie sich jemals ändern? Es kann sich ändern, wenn Sie eine andere Aktivität starten, die die Ausrichtung ändert. Dann wird diese neue Aktivität beendet und Sie kehren zu Ihrer Aktivität zurück. Die Standardabsicht für die Bilderfassung auf dem Samsung Galaxy S3 führt dies beispielsweise in bestimmten Ausrichtungen aus.
Gordon McCreight
2
@GordonMcCreight, können Sie dies bitte anhand eines realen Beispiels erklären? "Sie könnten fragen, ob sich die Ausrichtung" Hochformat "angegeben hat. Wie würde sich dies jemals ändern? Wenn Sie eine andere Aktivität starten, die die Ausrichtung ändert, kann sich dies ändern Neue Aktivität wird beendet und Sie kehren zu Ihrer Aktivität zurück. "
Tushar Pandey
3
Sicher, @TusharPandey. Wenn ich mich richtig erinnere, war der einzige Ort, an dem wir uns Sorgen machten, als unsere Aktivität die Standardabsicht für die Bilderfassung auf dem Samsung Galaxy S3 startete. Grundsätzlich wollten wir nur ein Foto machen und die Ergebnisse erhalten. Als die Kameraabsicht zurückkehrte, verursachte sie jedoch eine Orientierungsänderung, die den Status unserer Aktivität auslöschte, da wir nicht glaubten, dass wir uns davor schützen mussten (da unsere gesamte App immer nur im Hochformat ausgerichtet war). Wie und warum das Galaxy S3 dies tut, ist für mich (zugegebenermaßen begrenzt) unverständlich.
Gordon McCreight
8
Warum ist "keyboardHidden" enthalten?
Gonzobrains
24

Beachten Sie, dass

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

wird in der Manifestdatei hinzugefügt - wo die Aktivität definiert ist.

Null Zeiger
quelle
13

Ich denke, android:screenOrientation="portrait"kann für einzelne Aktivitäten verwendet werden. Verwenden Sie dieses Attribut also in einem <activity>Tag wie:

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

Wenn Sie eine Menge Aktivitäten wie meine haben, in Ihrer Anwendung oder wenn Sie nicht den Code für jedes Aktivitäts-Tag im Manifest eingeben möchten, können Sie dies tun.

In Ihrer Application Base-Klasse erhalten Sie einen Lebenszyklus-Rückruf

Im Grunde genommen ist das, was für jede Aktivität beim Erstellen der On-Create-in-Application-Klasse passiert, hier ausgelöst wird, der Code.

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

            }
        });
}

ich hoffe das hilft.

Muneef M.
quelle
1
Effiziente Antwort! Dies sollte die richtige Antwort sein, insbesondere für diejenigen, die komplexe Apps entwickeln, die stark von einer großen Anzahl von Aktivitäten abhängen.
FEBRYAN ASA PERDANA
10

Stellen Sie den Force-Hochformat- oder Querformatmodus ein und fügen Sie Linien hinzu.

Import unter Zeile:

import android.content.pm.ActivityInfo;

Fügen Sie die untere Zeile direkt darüber hinzu setContentView(R.layout.activity_main);

Für Porträt :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

Für die Landschaft :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

Das wird definitiv funktionieren.

Parth Patel
quelle
1
Dies schlägt mit Android 9 auf einigen Geräten fehl - Bildschirmrotationsübergang ist für einen kurzen Moment sichtbar, auch wenn Sie nur PORTRAIT
Igor Wojda
Können Sie bitte die Geräteinformationen angeben, in denen Sie dies gesehen haben, wenn möglich
Parth Patel
4

Laut Android-Dokumentation sollten Sie häufig auch screenSizeeine mögliche Konfigurationsänderung einbeziehen.

android:configChanges="orientation|screenSize"

Wenn Ihre Anwendung auf API-Level 13 oder höher abzielt (wie durch die Attribute minSdkVersion und targetSdkVersion deklariert), sollten Sie auch die Konfiguration "screenSize" deklarieren, da sie sich auch ändert, wenn ein Gerät zwischen Hoch- und Querformat wechselt.

Auch, wenn Sie alle Werte enthalten keyboardHiddenin Ihren Beispielen sollten nicht Sie dann auch prüfen locale, mcc, fontScale, keyboardund andere? ..

Martynas
quelle
3

Ich hatte diese Zeile in meiner 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">

Was ich geändert habe (gerade hinzugefügt 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">

Das hat die Dinge für mich behoben.

Ian Jamieson
quelle
2

Eine Ergänzung: Ich habe kürzlich eine App aktualisiert, die vorherige funktionierte sowohl im Quer- als auch im Hochformat, und ich möchte, dass die aktualisierte Version im Hochformat funktioniert, also habe ich hinzugefügt

android:screenOrientation="portrait"

auf die entsprechende Aktivität, und es stürzte gerade ab, als ich das Update getestet habe. Dann habe ich hinzugefügt

android:configChanges="orientation|keyboardHidden"

auch und es funktioniert.

user2819453
quelle
1
Wenn dies keine Antwort auf die Frage ist, kann es hilfreich sein, sie als Kommentar hinzuzufügen.
JPReddy
Überprüfen Sie, ob Sie es der Aktivität hinzugefügt haben, die nicht für den Anwendungsblock vorgesehen ist
Waran
1

Ich denke, Sie möchten android:configChanges="orientation|keyboardHidden"Ihre Aktivität erweitern? Andernfalls wird die Aktivität bei Konfigurationsänderung neu gestartet. Das onConfigurationChangedwürde dann nicht heißen, nur dasonCreate

Nanne
quelle
1

Wenn Sie unterschiedliche Ausrichtungen debugund releaseBuilds unterstützen möchten , schreiben Sie dies (siehe https://developer.android.com/studio/build/gradle-tips#share-properties-with-the-manifest ).

In build.gradleIhren appOrdner schreiben:

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

Dann AndroidManifestkönnen Sie in diese Variable "Orientierung" in jedem verwenden Activity:

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

Sie können hinzufügen android:configChanges:

manifestPlaceholders = [configChanges: "", orientation: "fullSensor"]im Debug und manifestPlaceholders = [configChanges: "keyboardHidden|orientation|screenSize", orientation: "portrait"]in der Veröffentlichung,

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

Kurze Antwort: Tu es nicht.

Gestalten Sie Ihre App so, dass sie sowohl im Hoch- als auch im Querformat ausgeführt werden kann. Es gibt keine Benutzeroberfläche, die nicht für Hoch- und Querformat geeignet ist. Nur faule oder einfallslose Entwickler.

Der Grund dafür ist ziemlich einfach. Sie möchten, dass Ihre App auf möglichst vielen verschiedenen Geräten von einem möglichst breiten Publikum verwendet werden kann. Indem Sie eine bestimmte Bildschirmausrichtung erzwingen, verhindern Sie, dass Ihre App (brauchbar) auf Geräten ausgeführt wird, die diese Ausrichtung nicht unterstützen, und Sie frustrieren und entfremden potenzielle Kunden, die eine andere Ausrichtung bevorzugen.

Beispiel: Sie entwerfen Ihre App so, dass der Porträtmodus erzwungen wird. Ein Kunde lädt die App auf ein 2-in-1-Gerät herunter, das er überwiegend im Querformat verwendet.
Konsequenz 1: Ihre App ist unbrauchbar oder Ihr Kunde muss sein Gerät abdocken, drehen und in einer für ihn nicht vertrauten oder komfortablen Ausrichtung verwenden.
Konsequenz 2: Der Kunde ist frustriert über das nicht intuitive Design Ihrer App und findet eine Alternative oder macht die App komplett kaputt.

Ich kämpfe gerade mit einer App damit und als Verbraucher und Entwickler hasse ich es. So nützlich die App auch ist, so fantastisch die Funktionen sind, die sie bietet, ich hasse die App absolut, weil sie mich dazu zwingt, eine Ausrichtung zu verwenden, die jeder anderen Art und Weise, wie ich mein Gerät verwende, widerspricht.

Sie möchten nicht, dass Ihre Kunden Ihre App hassen.


Ich weiß, dass dies die Frage nicht direkt beantwortet, deshalb möchte ich es denjenigen, die neugierig sind, etwas näher erläutern.

Es gibt eine Tendenz für Entwickler, wirklich gut im Schreiben von Code und wirklich schrecklich im Design zu sein. Diese Frage, obwohl sie sich wie eine Codefrage anhört und der Fragesteller sicherlich das Gefühl hat, dass es sich um eine Codefrage handelt, ist wirklich eine Entwurfsfrage.

Die Frage ist wirklich: "Soll ich die Bildschirmausrichtung in meiner App sperren?" Der Fragesteller hat die Benutzeroberfläche so gestaltet, dass sie nur im Hochformat funktioniert und gut aussieht. Ich vermute, es war, um Entwicklungszeit zu sparen oder weil der Workflow der App einem Porträtlayout (das für mobile Spiele üblich ist) besonders förderlich ist. Diese Gründe vernachlässigen jedoch alle wirklich wichtigen Faktoren, die das richtige Design motivieren.

  1. Kundenbindung - Sie möchten, dass sich Ihre Kunden in Ihre App hineingezogen fühlen und nicht aus ihr herausgedrückt werden. Die App sollte reibungslos von dem übergehen, was Ihr Kunde vor dem Öffnen Ihrer App getan hat. (Dies ist der Grund, warum die meisten Plattformen einheitliche Designprinzipien haben, sodass die meisten Apps mehr oder weniger ähnlich aussehen, obwohl dies nicht erforderlich ist.)

  2. Kundenreaktion - Sie möchten, dass Ihre Kunden positiv auf Ihre App reagieren. Sie sollten es genießen, es zu benutzen. Selbst wenn es sich um eine Gehaltsabrechnungs-App für die Arbeit handelt, sollte es für sie eine Freude sein, sie zu öffnen und einzusteigen. Die App sollte Ihren Kunden Zeit sparen und die Frustration über Alternativen verringern. (Apps, die Benutzer ärgern, führen zu Ressentiments gegen Ihre App, die zu Ressentiments gegen Ihre Marke führen.)

  3. Kundenkonvertierung - Sie möchten, dass Ihre Kunden schnell und einfach vom Surfen zur Interaktion wechseln können. Dies ist das ultimative Ziel jeder App, Impressionen in Einnahmen umzuwandeln. (Apps, die keinen Umsatz generieren, sind aus geschäftlicher Sicht Zeitverschwendung beim Erstellen.)

Eine schlecht gestaltete Benutzeroberfläche reduziert die Kundenbindung und -reaktion, was letztendlich zu geringeren Einnahmen führt. In einer mobilzentrierten Welt (und insbesondere im Bereich der Hoch- / Querformat-Anzeigemodi) erklärt dies, warum reaktionsschnelles Webdesign so wichtig ist. Walmart Canada hat im November 2013 Responsive Design auf seiner Website eingeführt und die Kundenkonvertierung um 20% gesteigert. O'Neill Clothing implementierte responsives Webdesign und der Umsatz von Kunden mit iOS-Geräten stieg um 101,25% und von Kunden mit Android-Geräten um 591,42% .

Entwickler tendieren auch dazu, sich intensiv auf die Implementierung einer bestimmten Lösung zu konzentrieren (z. B. das Sperren der Anzeigeorientierung), und die meisten Entwickler auf dieser Website helfen nur allzu gerne bei der Implementierung dieser Lösung, ohne zu hinterfragen, ob dies überhaupt die beste ist Lösung für das Problem.

Das Sperren der Bildschirmausrichtung entspricht dem UI-Design der Implementierung einer Do-While-Schleife. Sind Sie wirklich sicher, dass Sie es so machen möchten, oder gibt es eine bessere Alternative?

Erzwingen Sie nicht, dass Ihre App in einen einzelnen Anzeigemodus wechselt. Investieren Sie zusätzliche Zeit und Mühe, um darauf zu reagieren.

Thomas
quelle
2
Ich verstehe und stimme Ihnen zu, dass dies eine schlecht gestaltete Benutzeroberfläche ist. Dies ändert jedoch nichts an der Tatsache, dass Sie dies möglicherweise tun müssen, und dennoch sollte das Framework im Allgemeinen über diese Funktionen verfügen. Sie wissen nie, wie zukünftige Apps aussehen werden und müssen, daher ist die Frage weiterhin gültig.
Z. Khullah
1
Du liegst nicht falsch. Ich denke, meine Antwort wurde teilweise durch die Frustration angeheizt, die ich mit einigen Apps habe, die dies unnötig tun, und es ruiniert die Erfahrung vollständig. Ich werde sagen, dass die Anzahl der legitimen Fälle für das Sperren des Anzeigemodus unendlich gering ist (und immer noch machbar und vorzuziehen ist, nur nicht innerhalb des Budgets). Dies erinnert an andere Probleme; Da das Codieren so einfach wie bisher wird, schreiben viele Amateurentwickler Apps, weil sie Code kennen, ohne jedoch die Benutzeroberfläche oder das Design oder grundlegende Best Practices (Java-Apps, die in \ AppData - EWWWW installiert werden) zu lernen.
Thomas
1
Ich baue eine VR-App. Die Ausrichtung MUSS Landschaft sein, damit die Brille ihre Magie entfalten kann. Dies ist ein Beispiel für eine Benutzeroberfläche, die nicht für Hoch- und Querformat geeignet ist. Spiele müssen möglicherweise auch eine bestimmte Ausrichtung erzwingen. Ich wette, es gibt Unmengen legitimer Fälle.
Raslanove
1
Während StackExchange vorhanden ist, um bestimmte Fragen zu beantworten, sollten Antworten so geschrieben werden, dass sie so allgemein wie möglich gelten, damit diese Antworten für andere nützlich sind . Entwicklung ist viel mehr als nur das Schreiben von Code. Der Grund dafür, dass es so viele Junk-Anwendungen auf der Welt gibt, ist, dass so viele Entwickler dieses wichtige Prinzip vergessen oder nie lernen. Ich persönlich würde hinzufügen, dass wenn Sie VR auf einem Telefon machen, Sie VR falsch machen - aber die Kosten haben die Nachfrage nach VR auf Plattformen getrieben, die es niemals unterstützen sollten.
Thomas
1
Ich bin mit dieser Antwort nicht einverstanden, aber sie beantwortet eine Frage, die nicht gestellt wurde.
Bewegung