2012-01-28 21 views
42

Actualmente estoy luchando con este problema. Necesito comprobar si el dispositivo, donde está instalada la aplicación, tiene una tecla de menú de hardware. Debido a que no existe en algunos dispositivos como Galaxy Nexus, lo estoy mostrando directamente en la interfaz de usuario en este caso.Android: detecta mediante programación si el dispositivo tiene el botón de menú de hardware

Ya he consultado PackageManager.hasSystemFeature(), pero no encontré nada útil allí.

¿Alguien ha hecho esto?

+0

Hola. Gracias por su respuesta. Quiero moverme usando la barra de acción porque en mi opinión roba mucho espacio. En Galaxy Nexus puedo mostrar un botón de menú en la interfaz de usuario, pero este botón no es necesario cuando tienes un Nexus S con ICS, porque el Nexus S tiene un botón de menú de hardware. – NiThDi

+0

Mejor resolución http://stackoverflow.com/questions/16092431/check-for-navigation-bar –

Respuesta

90
ViewConfiguration.get(context).hasPermanentMenuKey() 

Consulte ViewConfiguration#hasPermanentMenuKey() para obtener más información. Tenga en cuenta que esto solo está disponible para API nivel 14+ (Android 4.0 Ice Cream Sandwich o más reciente).

+11

Disponible solo en API Level> = 14 http://developer.android.com/reference/android/view/ViewConfiguration.html#hasPermanentMenuKey() – Palani

+1

En API 11 - 13, puede suponer que MENU no está presente. – fhucho

+1

@fhucho Esto realmente no me ayuda. Necesito soportar API nivel 10 hacia arriba, por lo que Eclipse genera un error si trato de usar esto. Quiero llamar la atención del usuario para desbordar los elementos del menú emitiendo un brindis cuando hay una tecla de menú de hardware y, por lo tanto, no hay un menú de desbordamiento en la barra de acciones. Es realmente molesto que el icono de menú de desbordamiento no siempre se muestre independientemente de si hay una tecla de menú de hardware o no. (Por cierto, no entiendo tu último comentario). –

3

Incluso en dispositivos que ejecutan Honeycomb y más adelante, el sistema proporcionará un "botón de menú" para aplicaciones escritas para 2. x versiones de Android. Solo se llama el "menú de desbordamiento". Por lo tanto, no tiene sentido comprobar si habrá o no un botón: estará allí si es necesario.

Como norma general, debe verificar la funcionalidad específica, no mirar los números de versión del sistema/API. Utilice la clase ActionBar si está disponible, de lo contrario, vuelva al menú de opciones 2. x.

¿Has mirado Google’s action-bar tutorial? Eso aclara lo que deberías estar haciendo.

+3

Olvidé mencionar esto: por supuesto que probé primero el modo heredado, pero en este caso, el rendimiento de la vista de lista es realmente terrible porque falta aceleracion de hardware. Y tan pronto como establezca tagetSDK en 14, tendrá aceleración de hardware nuevamente, pero no el menú de desbordamiento. Esa es la razón por la que visualizo un botón de menú directamente en la interfaz de usuario, pero me gustaría ocultarlo si el dispositivo tiene un botón de menú de hardware. – NiThDi

+0

Si el sistema tiene una clase ActionBar, el botón de menú/"desbordamiento" solo se muestra si su aplicación no está consciente de ActionBar (lo cual sería falso en su caso). Entonces, en lugar de verificar dónde hay dicho botón, verifique si la clase ActionBar está disponible. –

+4

@ Lawrence D'Oliveiro: Esto no es del todo correcto. Si el tema está configurado en pantalla completa, la barra de acciones no se muestra en CUALQUIER dispositivo en CUALQUIER versión de Android. Eso significa que en los dispositivos que no tengan botón de menú de hardware, no se podrá acceder al menú de opciones/barra de acciones/desbordamiento. Si configura el tema en pantalla completa, se mostrarán actividades en todos los dispositivos, como si fueran precombustibles.Lo mismo es cierto para los temas configurados para que no se muestre una barra de título. Por lo tanto, para las aplicaciones que se ejecutan en modo de pantalla completa o modo barra de texto, es necesario verificar el menú de hardware y se debe proporcionar una alternativa. – mrd

1

Creo que una posible y mejor solución es agregar una barra de acciones propia. Entonces, todos los dispositivos pueden verlo y no es necesario verificar la configuración del hardware o la versión de 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

esto es incorrecto!!. para API inferiores a 11, se bloqueará porque no puede llamar a la función "hasPermanentMenuKey()". eso es porque existe desde API 14 y superior. –

+7

Por lo que puedo decir, no llamará a PerManntMenuKey() porque la comprobación> = 14 fallará y la llamada no se realizará. Dicho esto, cada vez que uso un método específico de API, siempre creo un método xxV14() para manejarlo, de modo que pueda ignorar la advertencia correctamente sin preocuparme de que otras llamadas no sean atendidas. – 3c71

+0

Sí, 'Build.VERSION.SDK_INT> = 14' tendría que ser verdadero para que el resto sea evaluado. Tenga en cuenta que Honeycomb (API 11-13) solo estaba disponible en tabletas, y no se esperaba que tuviera un botón de menú. Por lo tanto, si su objetivo es decidir si mostrar o no un botón de menú en la interfaz de usuario, este código debería funcionar en todas las versiones de API. El único efecto indeseable sería si alguna vez se encontrara con una tableta Honeycomb con un botón físico de Menú (no estoy seguro si existe), y el problema sería simplemente cosmético. Ver también http://android-developers.blogspot.de/2012/01/say-goodbye-to-menu-button.html. – user149408

-1

Si quieres un calificador de recursos, lo que podría ser el caso, ya que se quiere diferenciar las interfaces de usuario, utilice keyssoft calificador de recursos.

+0

calificador de keysoft se utiliza para detectar un teclado de hardware, no la barra de navegación. – lionello

1

calificador de keysoft se utiliza para detectar un teclado de hardware, no la barra de navegación.

En este artículo se resuelve:

Check for navigation bar

+0

mejor solución hasta ahora ... (trabajando para android 2.2) –

Cuestiones relacionadas