wake-up-neo.com

Überprüfen Sie die Navigationsleiste

Ich versuche zu überprüfen, ob die Navigationsleiste Android beim Laden vorhanden ist, damit ich ein Layout entsprechend anpassen kann. Hat jemand Vorschläge?

Dies ist die Navigationsleiste, die ich zu erkennen versuche: enter image description here

P.S. Alles, was ich bisher gefunden habe, sind "schlechte" Möglichkeiten, die Leiste zu entfernen, was ich nicht tun möchte.

47
Jonno

Ich habe einige Zeit gebraucht, aber ich habe einen zuverlässigeren Weg gefunden, als mich auf hasPermanentMenuKey () zu verlassen, was bei neueren Handys wie HTC One ohne Menütaste nicht funktioniert Sie müssen jedoch Home- und Back-Tasten verwenden, um die weiche Navigationsleiste nicht zu benötigen (oder anzuzeigen). Um dies zu umgehen, versuchen Sie den folgenden Code, der auch nach einem Zurück-Button sucht:

boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey();
boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);

if(!hasMenuKey && !hasBackKey) {
    // Do whatever you need to do, this device has a navigation bar
}
48
philask

Es gibt keine zuverlässige Möglichkeit, nach einer Navigationsleiste zu suchen. Mit KeyCharacterMap.deviceHasKey Sie können überprüfen, ob bestimmte physische Schlüssel auf dem Gerät vorhanden sind. Diese Informationen sind jedoch nicht sehr nützlich, da Geräte mit physischen Schlüsseln weiterhin über eine Navigationsleiste verfügen können. Geräte wie das OnePlus One oder jedes andere Gerät, auf dem ein benutzerdefiniertes ROM ausgeführt wird, verfügen über eine Option in den Einstellungen, mit der die physischen Tasten deaktiviert und eine Navigationsleiste hinzugefügt werden. Es gibt keine Möglichkeit zu überprüfen, ob diese Option aktiviert ist, und deviceHasKey gibt für die von dieser Option deaktivierten Schlüssel weiterhin true zurück.

Dies ist die nächste, die Sie bekommen können:

boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
boolean hasHomeKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_HOME);

if (hasBackKey && hasHomeKey) {
    // no navigation bar, unless it is enabled in the settings
} else {
    // 99% sure there's a navigation bar
}

Wenn die Zurück- und die Starttaste nicht physisch auf dem Gerät vorhanden sind, muss es eine Navigationsleiste haben, da der Benutzer sonst überhaupt nicht navigieren kann. Sie können sich jedoch nie zu 100% sicher sein, da die Hersteller deviceHasKey falsch implementieren können.

33
Rudey

Eine andere Lösung (ein Teil meiner Klasse tilsUISystem )

    public static boolean hasNavBar (Resources resources)
    {
        //Emulator
        if (Build.FINGERPRINT.startsWith("generic"))
            return true;

        int id = resources.getIdentifier("config_showNavigationBar", "bool", "Android");
        return id > 0 && resources.getBoolean(id);
    }
9
Pauland

Hier ist eine kurze Antwort, die die Lösungen von Pauland und Philask kombiniert. Ich fürchte, ich habe nicht genügend Geräte zur Verfügung, um zu testen, ob es überall funktioniert. Es würde mich interessieren, die Ergebnisse anderer zu hören.

boolean hasNavBar(Context context) {
    Resources resources = context.getResources();
    int id = resources.getIdentifier("config_showNavigationBar", "bool", "Android");
    if (id > 0) {
        return resources.getBoolean(id);
    } else {    // Check for keys
        boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey();
        boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
        return !hasMenuKey && !hasBackKey;
    }
}
8
Tad

sie können diesen Code zur onCreate () -Methode Ihrer Aktivität hinzufügen:

 View decorView = getWindow().getDecorView();
decorView.setOnSystemUiVisibilityChangeListener
        (new View.OnSystemUiVisibilityChangeListener() {
            @Override
            public void onSystemUiVisibilityChange(int visibility) {
                if ((visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) {
                    // TODO: The navigation bar is visible. Make any desired
                    // adjustments to your UI, such as showing the action bar or
                    // other navigational controls.
                } else {
                    // TODO: The navigation bar is NOT visible. Make any desired
                    // adjustments to your UI, such as hiding the action bar or
                    // other navigational controls.
                }
            }
        });
5
joe

Diese Methode hat bei mir funktioniert

    int id = getResources().getIdentifier("config_showNavigationBar","bool","Android");
        boolean result = id > 0 && getResources().getBoolean(id);
//
        if(result) {

            // Do whatever you need to do, this device has a soft Navigation Bar
        }

Es hat bei mir funktioniert und in vielen Geräten getestet.

2
ANAND SONI

Etwas, das wahrscheinlich besser funktionieren sollte, ist das Messen des Bildschirms.

Ab API 17 gibt es getWindowManager().getDefaultDisplay().getRealSize(), das mit der von getWindowManager().getDefaultDisplay().getSize() zurückgegebenen Größe verglichen werden kann.

Wenn Sie unterschiedliche Ergebnisse erhalten, kann man mit Sicherheit sagen, dass es eine Navigationsleiste gibt, und wenn Sie dieselben Ergebnisse erhalten, gibt es keine. Eine Sache, auf die Sie achten sollten, ist Ihr Ziel-SDK und die unterstützten Bildschirme. Dies kann dazu führen, dass das Ergebnis von getSize() skaliert wird, wenn Android) glaubt, dass Ihre App nicht gut funktioniert das aktuelle Gerät ohne Skalierung.

Unter API 17 können Sie den Bildschirm über getWindowManager().getDefaultDisplay().getMetrics() sowohl im Quer- als auch im Hochformat messen. Auch hier bedeuten unterschiedliche Ergebnisse wahrscheinlich, dass eine Navigationsleiste vorhanden ist.

Wenn Sie jedoch die gleichen Ergebnisse erzielen, wissen Sie es nicht, da Telefone die Navigationsleiste auch im Querformat auf der kürzeren Kante halten können. Eine fundierte Vermutung wäre, dass, wenn entweder die Breite oder die Höhe 4% bis 8% kleiner ist als Standardgrößen wie 1280x800, 1280x720, 1024x600, während die andere Dimension gleich ist, gibt es wahrscheinlich wieder eine Navigationsleiste. Wetten Sie aber nicht darauf. Es gibt zu viele Auflösungen, die sich zu wenig voneinander unterscheiden, damit dies gut funktioniert.

1
ciobi
boolean hasNavBar(Context context) {
    if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
        // navigation bar was introduced in Android 4.0 (API level 14)
        Resources resources = context.getResources();
        int id = resources.getIdentifier("config_showNavigationBar", "bool", "Android");
        if (id > 0) {
            return resources.getBoolean(id);
        } else {    // Check for keys
            boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey();
            boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
            return !hasMenuKey && !hasBackKey;
        }
    } else {
        return false;
    }
}
1
Kishan Vaghela

Ich sehe die Antworten oben, ich möchte darauf hinweisen, dass das "nicht vorhanden" als die Höhe von 0 angesehen werden kann; so kann es sein:

public static int getScreenH(Context context) {
    DisplayMetrics dm = new DisplayMetrics();
    dm = context.getResources().getDisplayMetrics();
    int h = dm.heightPixels;
    return h;
}

public static int getDpi(Context context) {

    DisplayMetrics displayMetrics1 = context.getResources().getDisplayMetrics();
    int height1 = displayMetrics1.heightPixels;

    int dpi = 0;
    WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    Display display = windowManager.getDefaultDisplay();
    DisplayMetrics displayMetrics = new DisplayMetrics();

    @SuppressWarnings("rawtypes")
    Class c;
    try {
        c = Class.forName("Android.view.Display");
        @SuppressWarnings("unchecked")
        Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);
        method.invoke(display, displayMetrics);
        dpi = displayMetrics.heightPixels;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return dpi;
}

public static int getBottomStatusHeight(Context context) {
    int totalHeight = getDpi(context);

    int contentHeight = getScreenH(context);

    return totalHeight - contentHeight;
}

`` `

0
user2944157