Erzwingen Sie, dass eine Android-Aktivität immer den Querformatmodus verwendet

144

Ich verwende den Android VNC Viewer auf meinem HTC G1 . Aber aus irgendeinem Grund befindet sich diese Anwendung immer im Querformat, obwohl sich mein G1 im Hochformat befindet. Da der Android VNC-Viewer Open Source ist, möchte ich wissen, wie es möglich ist, dass eine Aktivität mit Hardcode als "Landschaft" bezeichnet wird. Ich möchte es ändern, um die Telefonausrichtung zu respektieren.

hap497
quelle

Antworten:

188

Schauen Sie sich die AndroidManifest.xml ( Link ) in Zeile 9 an:

<activity android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden" android:name="VncCanvasActivity">

Diese Zeile gibt die screenOrientationLandschaft als Querformat an, aber der Autor überschreibt alle Änderungen der Bildschirmausrichtung mit configChanges="orientation|keyboardHidden". Dies weist auf eine überschriebene Funktion in VncCanvasActivity.java hin.

Wenn Sie sich VncCanvasActivity ansehen, steht in Zeile 109 die überschriebene Funktion:

@Override
public void onConfigurationChanged(Configuration newConfig) {
  // ignore orientation/keyboard change
  super.onConfigurationChanged(newConfig);
}

Der Autor hat ausdrücklich einen Kommentar abgegeben, um Änderungen an Tastatur oder Ausrichtung zu ignorieren.


Wenn Sie dies ändern möchten, können Sie zur oben gezeigten Datei AndroidManifest.xml zurückkehren und die Zeile in Folgendes ändern:

<activity android:screenOrientation="sensor" android:name="VncCanvasActivity">

Dies sollte das Programm so ändern, dass beim Drehen des Geräts vom Hoch- zum Querformat gewechselt wird.

Dies funktioniert möglicherweise, kann jedoch das Aussehen der Benutzeroberfläche beeinträchtigen, je nachdem, wie das Layout erstellt wurde. Sie müssen das berücksichtigen. Abhängig davon, wie die Aktivitäten codiert sind, stellen Sie möglicherweise fest, dass beim Ändern der Bildschirmausrichtung die Werte, die in Eingabefelder eingegeben wurden, verschwinden. Dies muss möglicherweise auch behandelt werden.

Pulkit Sethi
quelle
3
Warum genau wird das configChangesAttribut benötigt? Es scheint auf meinem Nicht-Tastatur-Telefon ohne es zu funktionieren ... In welchen Situationen ändert sich die Ausrichtung in Hochformat, wenn Sie das screenOrientation="landscape"aber weglassen configChanges?
Timmmm
Wie erzwinge ich eine integrierte Aktivität wie die Systembildauswahlbibliothek nur im Quer- oder Hochformat?
Jacky
118

Sie können dieselben Daten auch in Ihrem Java-Code festlegen.

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Mit anderen Werten in ActivityInfo können Sie das sensorgesteuerte oder gesperrte Porträt wiederherstellen. Persönlich möchte ich es auf etwas im Manifest setzen, wie in einer anderen Antwort auf diese Frage vorgeschlagen, und es später mit dem obigen Aufruf im Android SDK ändern, wenn es nötig ist.

Haseman
quelle
@ Yegor Nicht immer. Von Android Docs:If the activity is currently in the foreground or otherwise impacting the screen orientation, the screen will immediately be changed (possibly causing the activity to be restarted)
Chaitanya
40

In meinem OnCreate(Bundle)Fall mache ich im Allgemeinen Folgendes:

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
anwarma
quelle
2
Die Manifest-Methode in den anderen Antworten schien nicht zu funktionieren, aber @anwarma Ihre
Anup
31

Sie können die Ausrichtung einer Aktivität im Manifest angeben. Siehe hier .

<activity android:allowTaskReparenting=["true" | "false"]
...
          android:screenOrientation=["unspecified" | "user" | "behind" |
                                     "landscape" | "portrait" |
                                     "sensor" | "nosensor"]
...
                                       "adjustResize", "adjustPan"] >  
Michael Krauklis
quelle
24

Im Manifest:

<activity  android:name=".YourActivity"
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize">

In Ihrer Tätigkeit:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.your_activity_layout);
avisper
quelle
11

Das Folgende ist der Code, mit dem ich alle Aktivitäten im Querformat angezeigt habe:

<activity android:screenOrientation="landscape"
          android:configChanges="orientation|keyboardHidden"
          android:name="abcActivty"/>
Megha
quelle
2
"Orientierung" Wenn Ihre Anwendung auf API-Level 13 oder höher abzielt, sollten Sie auch "screenSize"
Mina Fawzy
7

Eine schnelle und einfache Lösung besteht darin, für die Datei AndroidManifest.xml für jede Aktivität, die Sie in den Querformatmodus zwingen möchten, Folgendes hinzuzufügen:

android:screenOrientation="landscape"
Joshgoldeneagle
quelle
5

Dies funktioniert für Xamarin.Android. In OnCreate ()

RequestedOrientation = Android.Content.PM.ScreenOrientation.Landscape;
Komm herein
quelle
4

Das ist es!! Ich warte lange auf dieses Update.

Ich habe ein altes Android-Problem über den Doppelstart einer Aktivität, für die ein (programmgesteuerter) Querformatmodus erforderlich ist: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

Jetzt macht Android den Landschaftsmodus beim Start.

AndrewDC
quelle
3

Arslan, warum willst du die Orientierung programmatisch erzwingen, obwohl es bereits einen Weg im Manifest gibt? <activity android:name=".youractivityName" android:screenOrientation="portrait" />

Blauer Mond
quelle
Ich bin nicht der Fragesteller, aber vielleicht möchte er programmatisch erzwingen, weil er es zu einer bestimmten Zeit erzwingen möchte?
Hamzah Malik
1

Es ist IMO falsch, es im Code zu tun, und noch mehr, wenn Sie es in onCreate einfügen. Tun Sie es im Manifest und das "System" kennt die Ausrichtung vom Start der App. Und diese Art von Meta oder Top-Level "Anleitung" sollte im Manifest sein. Wenn Sie es sich selbst beweisen möchten, setzen Sie eine Unterbrechung in onCreate der Aktivität. Wenn Sie es dort im Code tun, wird es zweimal aufgerufen: Es startet im Hochformat und wird dann auf Querformat umgeschaltet. Dies geschieht nicht, wenn Sie dies im Manifest tun.

RichieHH
quelle
1
Ich bin nicht einverstanden. Es ist immer meine bevorzugte Methode, irgendetwas im Code zu tun, anstatt über ein Manifest. Basierend auf dem Prinzip der Einzelverantwortung sollte sich das Manifest nur mit Eigenschaften, Berechtigungen und API-Bindungen auf Anwendungsebene befassen. Ich bin eigentlich nicht damit einverstanden, dass das <activity> -Tag überhaupt in einem Anwendungsmanifest vorhanden ist, und habe es daher nie dort abgelegt (und es funktioniert einwandfrei). Wie eine Aktivität präsentiert wird, ist offensichtlich ein Präsentationsproblem. Ihre Aktivität sollte allein für die Darstellung verantwortlich sein. Daher füge ich normalerweise die gesamte Präsentationslogik in den Ansichts- / Aktivitätscode ein.
Kommen Sie
1

Fügen Sie die folgenden Zeilen in Aktivität hinzu

Sie müssen an jeder Aktivität teilnehmen

für die Landschaft

android:screenOrientation="landscape"
tools:ignore="LockedOrientationActivity"

für Porträt

android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity"

Hier das Beispiel für MainActivity

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="org.thcb.app">
    <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="landscape"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".MainActivity2"
            android:screenOrientation="portrait"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
Chetan
quelle
0

Für Android 4.0 (Ice Cream Sandwich) und höher musste ich diese neben dem landscapeWert hinzufügen .

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"

Nur zu verwenden keyboardHidden|orientationwürde immer noch zu Speicherverlusten und zur Wiederherstellung meiner Aktivitäten führen, wenn der Netzschalter gedrückt wird.

Peterdk
quelle
Alarm für schlechte Praxis! Dies hat nichts damit zu tun, die Aktivität im Querformat zu erzwingen. Sie müssen immer die Speicherung und Wiederherstellung des Status Ihrer Aktivität implementieren. Das sind grundlegende Kenntnisse in der Android-Entwicklung. Lösen Sie das nicht mit diesem hackigen Fix. Die Aktivität kann vom System immer geschlossen werden, wenn mehr Speicher benötigt wird.
Roel
@Roel, nun, es ist die einzige Möglichkeit, zu verhindern, dass die Aktivität zurück zum Hochformat gedreht wird, wenn Sie beispielsweise das Gerät drehen. Es wird verhindert, dass diese Konfigurationsänderungen die Aktivität beeinflussen.
Peterdk
Entschuldigung für die etwas mürrische Nachricht, aber ich habe sie getestet und nicht alle diese Werte für den Querformatmodus. Wenn Sie alle diese Werte hinzufügen, bedeutet dies, dass Sie die Änderungen in onConfigurationChanged () selbst vornehmen. Stattdessen wird die Aktivität nur neu gestartet (und Sie müssen dies implementieren!). Wenn Sie jedoch die Landschaftsform erzwingen, erfolgt keine Rotation.
Roel
Hallo, einige von ihnen werden möglicherweise nicht benötigt, aber das Weglassen aller führt zu seltsamen Rotationsproblemen. Ich kann jetzt nicht testen, aber als ich eine App entwickelte, die ständig im Querformat sein musste, war die Verwendung orientation|screensizenicht in allen Fällen ausreichend. Es würde automatisch zum Porträt zurückkehren.
Peterdk
Diese Konfigurationsänderungen werden auch in Google Mobile Ads und anderen Ad SDKs verwendet. Von dort habe ich sie damals bekommen.
Peterdk
0

Verwenden Sie ActivityInfo (android.content.pm.ActivityInfo) in Ihrer onCreate-Methode, bevor Sie die setLayout-Methode wie folgt aufrufen

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Yamikani Sita
quelle
0

Nur
Android verwenden: screenOrientation = "Porträt" Tools: ignore = "LockedOrientationActivity"

Vibhu Vikram Singh
quelle
-25

Drücken Sie CTRL+F11, um den Bildschirm zu drehen.

Yann Pascal DEUNGOUE DJOMENI
quelle
3
Sie möchten nun wissen, wie die Standardausrichtung einer App festgelegt wird und nicht, wie der Bildschirm gedreht werden kann.
Kyle K
STRG + f12 für Emulator.
Fauler