Wie kann ich überprüfen, ob sich das Android-Telefon im Quer- oder Hochformat befindet?
Überprüfen Sie die Ausrichtung auf dem Android-Telefon
hackbod
Die aktuelle Konfiguration, die verwendet wird, um zu bestimmen, welche Ressourcen abgerufen werden sollen, ist im Ressourcenverzeichnis verfügbar. Configuration
Objekt:
getResources().getConfiguration().orientation;
Sie können die Orientierung überprüfen, indem Sie sich den Wert ansehen:
int orientation = getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
// In landscape
} else {
// In portrait
}
Weitere Informationen finden Sie in der Android-Entwickler.
-
Oh, Entschuldigung, ich habe es falsch verstanden, ich dachte, Sie sagten, dass der Dienst die Konfigurationsänderung nicht sehen würde, wenn sich die Konfiguration ändert. Was Sie beschreiben, ist, dass … nun, es wird nichts angezeigt, weil sich nichts ändert, weil der Launcher die Bildschirmausrichtung gesperrt hat und keine Änderung zulässt. Es ist also richtig, dass sich .orientation nicht ändert, weil sich die Orientierung nicht geändert hat. Der Bildschirm ist immer noch im Hochformat.
– Hackbod
23. Februar 2012 um 8:32 Uhr
-
Das Nächste, was ich tun kann, ist, die Ausrichtung von den Sensoren abzulesen, was Mathematik beinhaltet, auf die ich im Moment nicht wirklich scharf bin.
– Archimedes Trajano
23. Februar 2012 um 18:21 Uhr
-
Es gibt nichts zu ärgern. Der Bildschirm hat sich nicht gedreht, er ist immer noch im Hochformat, es ist keine Drehung zu sehen. Wenn Sie überwachen möchten, wie der Benutzer sein Telefon bewegt, unabhängig davon, wie der Bildschirm gedreht wird, müssen Sie den Sensor direkt beobachten und entscheiden, wie Sie die Informationen interpretieren möchten, die Sie über die Bewegung des Geräts erhalten.
– Hackbod
24. Februar 2012 um 4:30 Uhr
-
Dies schlägt fehl, wenn die Bildschirmausrichtung festgelegt ist.
– Johannes
30. Juli 2013 um 14:27 Uhr
-
Wenn die Aktivität die Anzeige sperrt (
android:screenOrientation="portrait"
), gibt diese Methode denselben Wert zurück, unabhängig davon, wie der Benutzer das Gerät dreht. In diesem Fall würden Sie den Beschleunigungsmesser oder den Schwerkraftsensor verwenden, um die richtige Ausrichtung herauszufinden.– Katze
21. August 2014 um 23:08 Uhr
Jarek Potiuk
Wenn Sie getResources().getConfiguration().orientation auf einigen Geräten verwenden, werden Sie es falsch machen. Wir haben diesen Ansatz ursprünglich in verwendet http://apphance.com. Dank der Remote-Protokollierung von Apphance konnten wir es auf verschiedenen Geräten sehen und wir sahen, dass die Fragmentierung hier eine Rolle spielt. Ich habe seltsame Fälle gesehen: zum Beispiel abwechselnd Hochformat und Quadrat (?!) Auf dem HTC Desire HD:
CONDITION[17:37:10.345] screen: rotation: 270 orientation: square
CONDITION[17:37:12.774] screen: rotation: 0 orientation: portrait
CONDITION[17:37:15.898] screen: rotation: 90
CONDITION[17:37:21.451] screen: rotation: 0
CONDITION[17:38:42.120] screen: rotation: 270 orientation: square
oder überhaupt keine Orientierungsänderung:
CONDITION[11:34:41.134] screen: rotation: 0
CONDITION[11:35:04.533] screen: rotation: 90
CONDITION[11:35:06.312] screen: rotation: 0
CONDITION[11:35:07.938] screen: rotation: 90
CONDITION[11:35:09.336] screen: rotation: 0
Andererseits sind width() und height() immer korrekt (sie werden vom Fenstermanager verwendet, also sollte es besser sein). Ich würde sagen, die beste Idee ist, die Breite/Höhe IMMER zu überprüfen. Wenn Sie einen Moment darüber nachdenken, ist das genau das, was Sie wollen – zu wissen, ob die Breite kleiner als die Höhe ist (Hochformat), das Gegenteil (Querformat) oder ob sie gleich sind (Quadrat).
Dann kommt es auf diesen einfachen Code an:
public int getScreenOrientation()
{
Display getOrient = getWindowManager().getDefaultDisplay();
int orientation = Configuration.ORIENTATION_UNDEFINED;
if(getOrient.getWidth()==getOrient.getHeight()){
orientation = Configuration.ORIENTATION_SQUARE;
} else{
if(getOrient.getWidth() < getOrient.getHeight()){
orientation = Configuration.ORIENTATION_PORTRAIT;
}else {
orientation = Configuration.ORIENTATION_LANDSCAPE;
}
}
return orientation;
}
-
Danke! Das Initialisieren von “Orientierung” ist jedoch überflüssig.
– Herr Maffen
1. Oktober 2014 um 14:53 Uhr
-
getWidth
undgetHeight
sind nicht veraltet.– FindOut_Quran
21. Oktober 2015 um 4:28 Uhr
-
@ user3441905, ja, das sind sie. Verwenden
getSize(Point outSize)
stattdessen. Ich verwende API23.– Windreiter
2. Dezember 2015 um 11:13 Uhr
-
@jarek-potiuk es ist veraltet.
– Hades
18. Mai 2016 um 1:19 Uhr
Paul
Eine andere Möglichkeit, dieses Problem zu lösen, besteht darin, sich nicht auf den korrekten Rückgabewert der Anzeige zu verlassen, sondern sich auf die Auflösung der Android-Ressourcen zu verlassen.
Erstellen Sie die Datei layouts.xml
in den Ordnern res/values-land
und res/values-port
mit folgendem Inhalt:
res/values-land/layouts.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="is_landscape">true</bool>
</resources>
res/values-port/layouts.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="is_landscape">false</bool>
</resources>
In Ihrem Quellcode können Sie nun wie folgt auf die aktuelle Ausrichtung zugreifen:
context.getResources().getBoolean(R.bool.is_landscape)
-
Ich mag das, da es die Art und Weise nutzt, wie das System bereits die Orientierung bestimmt
– KrustyGString
29. September 2015 um 13:59 Uhr
-
Beste Antwort für Quer-/Hochformat-Check!
– vtlinh
3. August 2016 um 19:02 Uhr
-
Was wird sein Wert in der Standardwertdatei sein?
– Shashank Mishra
26. Februar 2020 um 17:20 Uhr
Nguyen Minh Binh
Eine vollständige Möglichkeit, die aktuelle Ausrichtung des Telefons anzugeben:
public String getRotation(Context context) {
final int rotation = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();
switch (rotation) {
case Surface.ROTATION_0:
return "portrait";
case Surface.ROTATION_90:
return "landscape";
case Surface.ROTATION_180:
return "reverse portrait";
default:
return "reverse landscape";
}
}
NguyenDat
Hier ist eine Code-Snippet-Demo, wie Sie die Bildschirmausrichtung erhalten, die von Hackbod und Martijn empfohlen wurde:
❶ Auslösen bei Änderung der Ausrichtung:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
int nCurrentOrientation = _getScreenOrientation();
_doSomeThingWhenChangeOrientation(nCurrentOrientation);
}
❷ Holen Sie sich aktuelle Orientierung, wie Hackbod empfiehlt:
private int _getScreenOrientation(){
return getResources().getConfiguration().orientation;
}
❸Es gibt alternative Lösungen, um die aktuelle Bildschirmausrichtung zu erhalten. ❷ Folgen Sie der Martijn-Lösung:
private int _getScreenOrientation(){
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
return display.getOrientation();
}
★Notiz: Ich habe versucht, sowohl ❷ als auch ❸ zu implementieren, aber bei RealDevice (NexusOne SDK 2.3) Orientation gibt es die falsche Ausrichtung zurück.
★Also ich gebrauchte Lösung empfehlen ❷ um eine Bildschirmorientierung zu erhalten, die mehr Vorteile hat: klar, einfach und funktioniert wie ein Zauber.
★Überprüfen Sie sorgfältig die Rückkehr der Ausrichtung, um sicherzustellen, dass sie wie erwartet korrekt ist (kann je nach Spezifikation des physischen Geräts begrenzt sein)
Hoffe es hilft,
Taryn
int ot = getResources().getConfiguration().orientation;
switch(ot)
{
case Configuration.ORIENTATION_LANDSCAPE:
Log.d("my orient" ,"ORIENTATION_LANDSCAPE");
break;
case Configuration.ORIENTATION_PORTRAIT:
Log.d("my orient" ,"ORIENTATION_PORTRAIT");
break;
case Configuration.ORIENTATION_SQUARE:
Log.d("my orient" ,"ORIENTATION_SQUARE");
break;
case Configuration.ORIENTATION_UNDEFINED:
Log.d("my orient" ,"ORIENTATION_UNDEFINED");
break;
default:
Log.d("my orient", "default val");
break;
}
Gemeinschaft
Einige Zeit ist vergangen, seit die meisten dieser Antworten gepostet wurden, und einige verwenden jetzt veraltete Methoden und Konstanten.
Ich habe Jareks Code aktualisiert, um diese Methoden und Konstanten nicht mehr zu verwenden:
protected int getScreenOrientation()
{
Display getOrient = getWindowManager().getDefaultDisplay();
Point size = new Point();
getOrient.getSize(size);
int orientation;
if (size.x < size.y)
{
orientation = Configuration.ORIENTATION_PORTRAIT;
}
else
{
orientation = Configuration.ORIENTATION_LANDSCAPE;
}
return orientation;
}
Beachten Sie, dass der Modus Configuration.ORIENTATION_SQUARE
wird nicht mehr unterstützt.
Ich habe festgestellt, dass dies auf allen Geräten, auf denen ich es getestet habe, zuverlässig ist, im Gegensatz zu der Methode, die die Verwendung von vorschlägt getResources().getConfiguration().orientation
-
Beachten Sie, dass getOrient.getSize(size) 13 API-Level erfordert
– Lester
24. September 2015 um 15:07 Uhr
Sehen Sie sich diese Antwort in einem ähnlichen Thread an: stackoverflow.com/a/26601009/3072449
– Zauberhände Pellegrin
28. Oktober 2014 um 5:15 Uhr
Warum fügen Sie nicht einfach ein Kotlin-Tag hinzu, um es bei Suchen mit dem Schlüsselwort Kotlin einfacher zu finden?
– Harsch
3. Juli 2021 um 20:00 Uhr