2013-02-13 84 views
8

如何判斷一個android設備是否有物理鍵或軟件導航欄?我需要根據是否繪製軟件導航來更改佈局。如何判斷一個Android設備是否有硬鍵

例如HTC Desire的C具有硬件按鍵: enter image description here

我要澄清 - 林看着導航欄,而不是鍵盤。回家等等,我試過了:

 getResources().getConfiguration().keyboard); 
     getResources().getConfiguration().navigation); 
     getResources().getConfiguration().navigationHidden); 

在兩個設備上返回相同的值。

+0

重複http://stackoverflow.com/questions/2415558/how-to-detect-hardware-keyboard-presence – 2013-02-13 12:00:19

回答

0

private boolean isHardwareKeyboardAvailable() { return getResources().getConfiguration().keyboard != Configuration.KEYBOARD_NOKEYS; }

此外,這裏更多信息。 http://developer.android.com/reference/android/content/res/Configuration.html#keyboard

編輯 - 要檢查是否有物理鍵盤

private boolean isPhysicalKeyboardAvailable() { return getResources().getConfiguration().keyboard == Configuration.KEYBOARD_QWERTY; }

欲瞭解更多有關不同的配置視圖 http://developer.android.com/reference/android/content/res/Configuration.html#keyboard

我相信這些作品之一。

2nd編輯 -

檢查。已經問過。

Android: Programmatically detect if device has hardware menu button

+0

這是不行的,它返回兩個設備上假 – serenskye 2013-02-13 12:09:43

+0

檢查更新。 – Synaero 2013-02-13 12:21:19

+0

不用,請參閱上面的內容,我爲這兩種設備使用相同的鍵盤! Configuration.KEYBOARD_NOKEYS; – serenskye 2013-02-13 13:30:21

40

通過這樣的第一次應用程序啓動並保存到喜好解決:

public static boolean hasSoftKeys(WindowManager windowManager){ 
    boolean hasSoftwareKeys = true; 
    //c = context; use getContext(); in fragments, and in activities you can 
    //directly access the windowManager(); 

    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN_MR1){ 
     Display d = c.getWindowManager().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; 
} 
+1

「getRealMetrics」方法僅適用於API 17(即Android 4.2) - 您暗示您不知道該設備,因此您可以真的不要依賴這種方法。 – 2013-07-09 18:14:36

+0

我同意這種方法,因爲'ViewConfiguration.get(context).hasPermanentMenuKey()'在某些設備上很棘手。所以當API> = 17時,我改用這個方法。 – AlexAndro 2013-12-18 10:26:58

+3

我也在設備上使用這種技術> = API 17.不要太挑剔,但是你的return語句可能會更容易理解,如下所示:'return(realWidth> displayWidth)|| (realHeight> displayHeight)' – 2014-06-18 15:07:02

2

在這裏,你去..這應該做你想做的。

@SuppressLint("NewApi") 
private static boolean hasSoftNavigation(Context context) 
{ 
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH){ 
     return !ViewConfiguration.get(context).hasPermanentMenuKey(); 
    } 
    return false; 
} 
+4

新星系s5沒有菜單hardqare鍵,它仍然使用硬鍵作爲家庭,最近和後面...這不是一個好的選擇使用。 – roiberg 2014-07-28 12:58:36

相關問題