Как обнаружить программную клавишу меню, доступную на устройстве Android?

Я хотел бы проверить наличие ключа меню на устройстве в приложении для Android. Для этого я использовал следующий код, чтобы определить, есть ли у погодного устройства аппаратное меню или нет, и он работает нормально.

!ViewConfiguration.get(ScsCommander.getInstance().getApplicationContext()).hasPermanentMenuKey()

Но я не нашел логики, чтобы узнать, есть ли на устройстве мягкое меню или нет.

Пожалуйста, подскажите, есть ли способ определить, программное меню доступно или нет в устройстве.


person Raghu Mudem    schedule 14.07.2015    source источник
comment
С чего вы взяли, что его не будет? Для аппаратного ключа требуется аппаратная часть, а для софт-клавиши вообще никаких требований нет, она должна быть. Функция проверки его доступности будет бесполезна.   -  person dtech    schedule 14.07.2015
comment
@ddriver спасибо за ваш ответ. Можем ли мы найти способ найти программную панель навигации, представленную на устройстве? или кнопка меню с 3 точками доступна для приложения?   -  person Raghu Mudem    schedule 14.07.2015


Ответы (1)


Не существует надежного/чистого способа проверить, присутствует ли программное меню (панель навигации) или нет!

Вы можете попробовать использовать приведенный ниже код (не проверен на всех устройствах и в любом случае не является надежным решением):

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;
    }
}

Здесь мы получаем идентификатор ресурса, используя класс Resources. Мы ищем ресурс «панель навигации», который передается в качестве 1-го параметра.

getIdentifier возвращает связанный идентификатор ресурса. Возвращает 0, если такой ресурс не найден. (0 не является допустимым идентификатором ресурса.)

В случае, если этот подход не работает, в else мы пытаемся проверить, присутствуют ли на устройстве определенные физические клавиши, такие как back или Home, которые обычно представляют собой панель навигации.

person AADProgramming    schedule 14.07.2015
comment
спасибо за повтор. Если чехол работает нормально на стольких устройствах. Но в остальном случай не дает надежного результата. Мы не можем использовать случай else. И есть идеи, с какого уровня API доступен config_showNavigationBar? - person Raghu Mudem; 17.07.2015