2016-06-08 2 views
5

Ich muss überprüfen, ob ein Gerät die Soft-Navigationsleiste hat, und ich folgte den Vorschlägen here.Erkennen Sie die Verfügbarkeit von Soft-Navigationsleisten in einem OnePlusOne-Gerät progmatisch?

Es funktioniert gut, außer auf OnePlus Geräte, aus irgendeinem Grund, dieser Code:

int id = resources.getIdentifier("config_showNavigationBar", "bool", android"); 
    return id > 0 && resources.getBoolean(id); 

false zurück, obwohl die Soft-Navigationsleiste angezeigt wird.

Jede Idee, wie kann ich das richtige Ergebnis erhalten?

Ich ziehe es vor, nicht die tatsächliche Breite und verfügbare Breite zu berechnen, es scheint wie teure Operation.

Danke.

+0

haben Sie eine Lösung dafür bekommen? –

+1

Ja. Schließlich habe ich diesen Code verwendet: öffentlichen boolean hasNavBar() { Anzeige d = getWindowManager(). GetDefaultDisplay(); DisplayMetrics dm = neue DisplayMetrics(); d.getRealMetrics (dm); int realHeight = dm.heightPixels; int realWidth = dm.widthPixels; d.getMetrics (dm); int displayHeight = dm.heightPixels; int displayWidth = dm.widthPixels; return (realWidth - displayWidth)> 0 || (realHeight - displayHeight)> 0; } Dies ergab das beste Ergebnis auf allen Geräten. – Sharas

Antwort

0

gut gibt es ein Verfahren hasPermanentMenuKey, der überprüft, ob die Hardware MenuKey vorhanden ist, in der Regel Samsung-Geräte es auf der linken Größe Home Taste hat.

Also, wenn es wahr zurückgibt, bedeutet es, dass das Telefon Hardware-Schlüssel hat und wenn es falsch ist, dann bedeutet es einfach Telefon hat Navigationsleiste.

Die Methode ist:

ViewConfiguration.hasPermanentMenuKey() 

Ich finde es ziemlich nützlich für mich. Ich hoffe es hilft

+0

Dies funktioniert nicht auf Geräten wie HTC eins und eins plus eins. Dies liefert immer true –

1

Siehe this Antwort. Es gibt jedoch keine 100% ige Sicherheit.

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 
} 

bearbeiten

Ein anderer Ansatz

public boolean hasNavBar (Resources resources) { 
    int id = resources.getIdentifier("config_showNavigationBar", "bool", "android"); 
    return id > 0 && resources.getBoolean(id); 
} 
+0

Dies funktioniert nicht auf Geräten wie HTC One, die benutzerdefinierte ROM –

+0

@SureshKumar Siehe die Bearbeitung. Es ist eine alternative Lösung. –

+0

das hat nicht funktioniert für mich in htc man mich:/ –

1

Ja, Sie können versuchen, diese:

WindowManager mgr = (WindowManager) getSystemService(WINDOW_SERVICE); 
      boolean hasSoftKey = Utils.hasSoftKeys(mgr, NPTApplication.this); 

public static boolean hasSoftKeys(WindowManager windowManager, Context c) { 
     boolean hasSoftwareKeys = true; 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
      Display d = windowManager.getDefaultDisplay(); 

      DisplayMetrics realDisplayMetrics = new DisplayMetrics(); 
      d.getRealMetrics(realDisplayMetrics); 

      int realHeight = realDisplayMetrics.heightPixels; 
      int realWidth = realDisplayMetrics.widthPixels; 

      DisplayMetrics displayMetrics = new DisplayMetrics(); 
      d.getMetrics(displayMetrics); 

      int displayHeight = displayMetrics.heightPixels; 
      int displayWidth = displayMetrics.widthPixels; 

      hasSoftwareKeys = (realWidth - displayWidth) > 0 || (realHeight - displayHeight) > 0; 
     } else { 
      boolean hasMenuKey = ViewConfiguration.get(c).hasPermanentMenuKey(); 
      boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK); 
      hasSoftwareKeys = !hasMenuKey && !hasBackKey; 
     } 
     return hasSoftwareKeys; 
    } 
+0

hat nicht funktioniert für mich in htc one me: / –

Verwandte Themen