Die schwarze Navigationsleiste am unteren Bildschirmrand kann unter Android nicht einfach entfernt werden. Es ist seit 3.0 Teil von Android als Ersatz für Hardwaretasten. Hier ist ein Bild:
Wie kann ich die Größe der Breite und die Höhe dieses UI-Elements in Pixel ermitteln?
Antworten:
Versuchen Sie den folgenden Code:
quelle
navigation_bar_height_landscape
Höhe der Navigationsleiste im Querformat undnavigation_bar_width
die Breite einer vertikalen Navigationsleiste). Sie müssen separat herausfinden, ob und wo die Navigationsleiste tatsächlich angezeigt wird, z. B. indem Sie prüfen, ob eine physische Menüschaltfläche vorhanden ist. Vielleicht finden Sie einen anderen Weg im Android-Quellcode unter android.googlesource.com/platform/frameworks/base/+/…Ich erhalte die Größe der Navigationsleiste, indem ich die von der App verwendbare Bildschirmgröße mit der tatsächlichen Bildschirmgröße vergleiche. Ich gehe davon aus, dass die Navigationsleiste vorhanden ist, wenn die von der App verwendbare Bildschirmgröße kleiner als die tatsächliche Bildschirmgröße ist. Dann berechne ich die Größe der Navigationsleiste. Diese Methode funktioniert mit API 14 und höher.
AKTUALISIEREN
Für eine Lösung, die Anzeigeausschnitte berücksichtigt, überprüfen Sie bitte Johns Antwort .
quelle
Die Höhe der Navigationsleiste variiert für einige Geräte, aber auch für einige Ausrichtungen. Zuerst müssen Sie überprüfen, ob das Gerät über eine Navigationsleiste verfügt, dann, ob es sich bei dem Gerät um ein Tablet oder ein Nicht-Tablet (Telefon) handelt, und schließlich müssen Sie die Ausrichtung des Geräts überprüfen, um die richtige Höhe zu erhalten.
quelle
hasBackKey = false!
obwohl es wahr sein sollte. Folgendes funktionierte stattdessen:boolean navBarExists = getResources().getBoolean(getResources().getIdentifier("config_showNavigationBar", "bool", "android"));
Tatsächlich hat die Navigationsleiste auf Tablets (mindestens Nexus 7) im Hoch- und Querformat unterschiedliche Größen, sodass diese Funktion folgendermaßen aussehen sollte:
quelle
context.getResources().getConfiguration().orientation
Ich denke, eine bessere Antwort ist hier, weil Sie damit auch eine gleichmäßige Ausschnitthöhe erzielen können.
Nehmen Sie Ihre Stammansicht und fügen Sie setOnApplyWindowInsetsListener hinzu (oder Sie können onApplyWindowInsets daraus überschreiben) und nehmen Sie insets.getSystemWindowInsets daraus.
In meiner Kameraaktivität füge ich meinem unteren Layout eine Auffüllung hinzu, die dem systemWindowInsetBottom entspricht. Und schließlich wurde das Problem mit dem Ausschnitt behoben.
mit appcompat ist es so
ohne appcompat:
quelle
setOnApplyWindowInsetsListener
stattdessen zu verwenden ? Wenn das so ist, wie? und warum hast du zwischen LOLLIPOP und den anderen unterschieden?ich hoffe das hilft dir
quelle
Dies ist mein Code, um paddingRight und paddingBottom zu einer Ansicht hinzuzufügen, um der Navigationsleiste auszuweichen. Ich habe einige der Antworten hier kombiniert und zusammen mit isInMultiWindowMode eine spezielle Klausel für die Querformatorientierung erstellt. Der Schlüssel ist, navigation_bar_height zu lesen , aber auch zu überprüfen config_showNavigationBar zu , um sicherzustellen, dass wir die Höhe tatsächlich verwenden sollten.
Keine der vorherigen Lösungen hat bei mir funktioniert. Ab Android 7.0 müssen Sie den Multi Window Mode berücksichtigen. Dies unterbricht die Implementierungen, bei denen display.realSize mit display.size verglichen wird, da realSize die Abmessungen des gesamten Bildschirms (beide geteilte Fenster) und die Größe nur die Abmessungen Ihres App-Fensters angibt . Wenn Sie die Auffüllung auf diesen Unterschied einstellen, bleibt Ihre gesamte Ansicht aufgefüllt.
quelle
Die Höhe der unteren Navigationsleiste beträgt 48 dp (sowohl im Hoch- als auch im Querformat) und 42 dp, wenn die Leiste vertikal platziert wird.
quelle
Die von Egidijus vorgeschlagene Lösung funktioniert perfekt für Build.VERSION.SDK_INT> = 17
Bei der Ausführung der folgenden Anweisung mit Build.VERSION.SDK_INT <17 auf meinem Gerät wurde jedoch "NoSuchMethodException" angezeigt:
Ich habe die Methode getRealScreenSize () für folgende Fälle geändert:
quelle
Ich habe dieses Problem für alle Geräte behoben (einschließlich Nexus 5, Samsung Galaxy Nexus 6 Edge +, Samsung S10, Samsung Note II usw.). Ich denke, dies wird Ihnen helfen, geräteabhängige Probleme zu lösen.
Hier füge ich zwei Arten von Codes hinzu:
Java-Code (für natives Android):
Und C # -Code (für Xamarin Forms / Android)
quelle
Display.getRealMetrics()
erfordert API Level 17screenOrientation
Standard ist,hasPermanentMenuKey
istfalse
nur, wenn nicht drehen. [2] WennscreenOrientation
Landschaft ist, fällt sie indisplayMetrics.heightPixels != realDisplayMetrics.heightPixels)
die andere. [3] WannscreenOrientation
ist Porträt,hasPermanentMenuKey
istfalse
.Kombinieren Sie die Antwort von @egis und anderen - dies funktioniert gut auf einer Vielzahl von Geräten, die auf Pixel EMU, Samsung S6, Sony Z3 und Nexus 4 getestet wurden. Dieser Code verwendet die Anzeigeabmessungen, um die Verfügbarkeit der Navigationsleiste zu testen, und verwendet dann die tatsächliche Größe der Systemnavigationsleiste, falls vorhanden.
quelle
So ermitteln Sie die Höhe der Navigationsleiste und der Statusleiste. Dieser Code funktioniert für mich auf einigen Huawei-Geräten und Samsung-Geräten . Die obige Lösung von Egis ist gut, auf einigen Geräten jedoch immer noch falsch. Also habe ich es verbessert.
Dies ist ein Code zum Abrufen der Höhe der Statusleiste
Diese Methode gibt immer die Höhe der Navigationsleiste zurück, auch wenn die Navigationsleiste ausgeblendet ist.
HINWEIS: Bei Samsung A70 gibt diese Methode die Höhe der Statusleiste + die Höhe der Navigationsleiste zurück. Auf anderen Geräten (Huawei) wird nur die Höhe der Navigationsleiste und 0 zurückgegeben, wenn die Navigationsleiste ausgeblendet ist.
Dies ist ein Code zum Abrufen der Höhe der Navigationsleiste und der Statusleiste
quelle
Ich habe dies getan, es funktioniert auf jedem Gerät, das ich getestet habe, und sogar auf Emulatoren:
quelle
Hier ist, wie ich das gelöst habe. Ich habe eine versteckte untere Leiste erstellt, die aufgefüllt werden muss, je nachdem, ob eine Navigationsleiste vorhanden ist oder nicht (kapazitiv, auf dem Bildschirm oder nur vor dem Lutscher).
Aussicht
Utils.java
quelle
In meinem Fall, in dem ich so etwas haben wollte:
Ich musste das Gleiche tun wie von @Mdlc vorgeschlagen, aber wahrscheinlich etwas einfacher ( nur Targeting > = 21):
Es funktioniert auch in der Landschaft:
Bearbeiten Die obige Lösung funktioniert im Mehrfenstermodus nicht ordnungsgemäß, wenn das verwendbare Rechteck nicht nur aufgrund der Navigationsleiste, sondern auch aufgrund der benutzerdefinierten Fenstergröße kleiner ist. Eine Sache, die mir aufgefallen ist, ist, dass in mehreren Fenstern die Navigationsleiste nicht über der App schwebt, sodass wir auch ohne Änderungen an der DecorView-Auffüllung das richtige Verhalten haben:
Beachten Sie den Unterschied, wie sich die Navigationsleiste in diesen Szenarien über dem unteren Rand der App befindet. Glücklicherweise ist dies leicht zu beheben. Wir können überprüfen, ob die App mehrere Fenster ist. Der folgende Code enthält auch den Teil zum Berechnen und Anpassen der Position der Symbolleiste (vollständige Lösung: https://stackoverflow.com/a/14213035/477790 )
Ergebnis im Samsung-Popup-Modus:
quelle
Getesteter Code zum Abrufen der Höhe der Navigationsleiste (in Pixel):
Getesteter Code zum Abrufen der Höhe der Statusleiste (in Pixel):
Pixel in dp konvertieren:
quelle
Im Fall von Samsung S8 gab keine der oben genannten Methoden die richtige Höhe der Navigationsleiste an, daher habe ich den KeyboardHeightProvider- Tastaturhöhenanbieter Android verwendet . Und es gab mir Höhe in negativen Werten und für meine Layoutpositionierung habe ich diesen Wert in Berechnungen angepasst.
Hier ist
KeyboardHeightProvider.java
:popupwindow.xml
::Verwendung in
MainActivity
Für weitere Hilfe können Sie einen Blick auf erweiterte Nutzung dieses haben hier .
quelle
Wie zum Beispiel in vielen der obigen Antworten vorgeschlagen
Es reicht möglicherweise nicht aus, nur die Höhe der Navigationsleiste zu ermitteln. Wir müssen prüfen, ob 1. die Navigationsleiste vorhanden ist, 2. sie sich unten oder rechts oder links befindet, 3. die App im Mehrfenstermodus geöffnet ist.
Glücklicherweise können Sie die lange Codierung leicht umgehen, indem Sie einfach
android:fitsSystemWindows="true"
Ihr Root-Layout festlegen. Das Android-System sorgt automatisch dafür, dass dem Stammlayout die erforderlichen Auffüllungen hinzugefügt werden, um sicherzustellen, dass die untergeordneten Ansichten nicht in die Navigationsleiste oder die Statusleistenbereiche gelangen.Es gibt eine einfache einzeilige Lösung
oder programmatisch
Sie können auch Root-Ansicht von erhalten
Weitere Informationen zum Abrufen der Root-Ansicht finden Sie unter https://stackoverflow.com/a/4488149/9640177
quelle