2012-01-28 2 views
42

В настоящее время я борюсь с этой проблемой. Мне нужно проверить, есть ли на устройстве, где установлено приложение, ключ аппаратного меню. Поскольку он не существует на некоторых устройствах, таких как Galaxy Nexus, я показываю его непосредственно в пользовательском интерфейсе в этом случае.Android: программно определить, есть ли у устройства аппаратное меню

Я уже рассмотрел PackageManager.hasSystemFeature(), но не нашел там ничего полезного.

Кто-нибудь уже это сделал?

+0

Привет. Спасибо за ваш ответ. Я хочу обойтись с помощью панели действий, потому что, по моему мнению, она занимает много места. В Galaxy Nexus я могу отображать кнопку меню в пользовательском интерфейсе, но эта кнопка становится ненужной, если у вас есть Nexus S с ICS, потому что Nexus S имеет кнопку меню аппаратного обеспечения. – NiThDi

+0

Лучшее разрешение http://stackoverflow.com/questions/16092431/check-for-navigation-bar –

ответ

90
ViewConfiguration.get(context).hasPermanentMenuKey() 

Для получения дополнительной информации см. ViewConfiguration#hasPermanentMenuKey(). Обратите внимание, что это доступно только для уровня API 14+ (Android 4.0 Ice Cream Sandwich или новее).

+11

Доступно только на уровне API> = 14 http://developer.android.com/reference/android/view/ViewConfiguration.html#hasPermanentMenuKey() – Palani

+1

В API 11-13 вы можете предположить, что МЕНЮ нет. – fhucho

+1

@fhucho Это на самом деле не помогает мне. Мне нужно поддерживать уровень API 10 вверх, поэтому Eclipse вызывает ошибку, если я попытаюсь использовать это. Я хочу обратить внимание пользователя на элементы меню переполнения, выпуская тост, когда есть клавиша меню оборудования и, следовательно, нет меню переполнения на панели действий. Это очень раздражает, что значок меню переполнения не всегда отображается независимо от того, есть ли меню аппаратного меню или нет. (Кстати, я не понимаю ваш последний комментарий.) –

3

Даже на устройствах, работающих под управлением Honeycomb, и позже система будет поставлять «кнопку меню» для приложений, написанных для 2. x версий Android. Только это называется «меню переполнения». Поэтому нет смысла проверять, будет ли такая кнопка или нет, она будет там, если понадобится.

В качестве общего руководства вы должны проверить определенную функциональность, а не смотреть номера версий системы/API. Используйте класс ActionBar, если он доступен, в противном случае резервное копирование в меню опций 2. x.

Вы посмотрели Google’s action-bar tutorial? Это делает более ясным, что вы должны делать.

+3

Забыл упомянуть об этом: Конечно, сначала я попробовал прежний режим, но в этом случае производительность listview действительно ужасна из-за отсутствия аппаратное ускорение. И как только вы установите tagetSDK на 14, вы снова получите аппаратное ускорение, но не меню переполнения. Вот почему я отображаю кнопку меню непосредственно в пользовательском интерфейсе, но я хотел бы скрыть ее, если на устройстве есть кнопка меню аппаратного обеспечения. – NiThDi

+0

Если система имеет класс ActionBar, кнопка меню/«переполнение» отображается только в том случае, если ваше приложение является ActionBar-unaware (что было бы ложным в вашем случае). Поэтому вместо проверки, где есть такая кнопка, проверьте, доступен ли класс ActionBar. –

+4

@ Lawrence D'Oliveiro: Это не совсем правильно. Если тема установлена ​​в полноэкранный режим, панель действий не отображается на ЛЮБОЙ устройстве в ЛЮБОЙ версии Android. Это означает, что на устройствах без аппаратного меню меню опций/панель действий/переполнение не будут доступны. Настройка темы в полноэкранном режиме отображает действия на всех устройствах, таких как предварительно сотовые.То же самое можно сказать и о том, что темы не отображаются на панели заголовков. Таким образом, для приложений, работающих в полноэкранном режиме или в режиме «нет», необходимо проверить аппаратное меню, и необходимо предоставить резервную копию. – mrd

1

Я думаю, что возможным и лучшим решением является добавление собственной панели действий. Поэтому каждое устройство может его увидеть, и вам не нужно проверять конфигурацию аппаратного обеспечения или версию Api.

23
if(Build.VERSION.SDK_INT <= 10 || (Build.VERSION.SDK_INT >= 14 &&  
           ViewConfiguration.get(this).hasPermanentMenuKey())) 
{ 
    // menu key is present 
} 
else 
{ 
    //No menu key 
} 
+0

это неправильно!. для API ниже 11, он будет сбой, поскольку он не может вызвать функцию hasPermanentMenuKey(). это потому, что он существует из API 14 и выше. –

+7

Насколько я могу судить, он не будет вызывать hasPermanentMenuKey(), потому что проверка> = 14 завершится неудачно, и вызов не будет выполнен. При этом каждый раз, когда я использую специфический для API метод, я всегда создаю метод xxV14() для его обработки, чтобы я мог правильно игнорировать предупреждение, не беспокоясь о других вызовах, о которых не заботятся. – 3c71

+0

Да, 'Build.VERSION.SDK_INT> = 14' должно быть истинным, чтобы все остальное оценивалось. Обратите внимание, что Honeycomb (API 11-13) доступен только на планшетах, и у них не было кнопки меню. Таким образом, если ваша цель состоит в том, чтобы решить, показывать или не показывать кнопку меню в пользовательском интерфейсе, этот код должен работать во всех версиях API. Единственным нежелательным эффектом было бы, если бы вы столкнулись с планшетами Honeycomb с физической кнопкой меню (не уверены, существуют ли какие-либо), и проблема будет просто косметической. См. Также http://android-developers.blogspot.de/2012/01/say-goodbye-to-menu-button.html. – user149408

-1

Если вы хотите спецификатор ресурс, который может быть случай, так как вы хотите, чтобы дифференцировать UIs, использовать keyssoft ресурс спецификатор.

+0

keysoft qualifier используется для обнаружения аппаратной клавиатуры, а не панели навигации. – lionello

1

keysoft qualifier используется для обнаружения аппаратной клавиатуры, а не панели навигации.

Эта статья решает эту проблему:

Check for navigation bar

+0

лучшее решение до сих пор ... (работает для Android 2.2) –

Смежные вопросы