38

Я являюсь поклонником кнопки меню, используемой в Android < 3.0, так как это было очень полезно для моих игровых приложений - это позволило мне возьмите важную, но не требующую игрового процесса функциональность (сохранить игру, ссылки на ссылки) и поместите ее где-нибудь там, где она не загромождает основной интерфейс игры, но все еще легко доступна (меню опций).Работа с отсутствующей кнопкой MENU в новых версиях Android (3.x и выше)

Это использование ключей стало проблемой с 3.0, поскольку она удалила кнопку MENU и заменила ее панелью действий. Панель действий действительно не подходит для игры, которая любит запускать полноэкранный режим, так что это была настоящая боль. Нет панели действий - нет доступа к меню параметров. Тем не менее, я мог бы игнорировать его некоторое время, так как у меня не было столько пользователей на планшетах, и у меня не было времени проверить это.

Однако ICS делает это серьезной проблемой, поскольку кнопка MENU, очевидно, не возвращается. Теперь мне не только приходится решать эти проблемы на планшетах, но и на телефонах.

Мое первое решение этой проблемы было просто поставить мягкую кнопку в моем GUI заменить кнопку жесткий MENU

this.openOptionsMenu(); 

И все возвращается на прекрасно работает в ICS.

Однако это не работает на Honeycomb. Вызов openOptionsMenu абсолютно ничего не делает, если вы не видите ActionBar.

Любые мысли о том, как с этим бороться?

  • Я предполагаю, что я всегда мог вернуться к использованию TargetSDK < 11 (тем самым заставляя ActionBar появляться на таблетках), но, насколько я могу видеть, это просто толкает проблему в будущее, которое я бы предпочитают не делать.

  • Отбросить меню параметров целиком и перейти только к контекстным меню? [Уточнение: под этим я подразумеваю, что вместо открытия меню опций - я использую только контекстные меню, поскольку - по крайней мере на данный момент - эти работы на всех устройствах].

Заинтересованы в том, чтобы узнать, что другие, у кого были подобные проблемы, со всем меню Options/ActionBar mess решили сделать.

+0

Ну, я не совсем уверен, но у меня есть таблетки, и bar внизу (как это называется, я думаю, что не Action Bar, поскольку это тот, что сверху)? не исчезает (это тот, у кого есть кнопка home, back, ..., на самом деле, она не может исчезнуть, это навязывается ОС). Множество приложений делают кнопку параметров там! Не могли бы вы сделать то же самое? Не использовали его и, следовательно, не знаю, как это сделать, хотя ... EDIT: Чтение ... вот что вы имеете в виду, вернувшись к использованию TargetSDK <11? – dom

+0

Предполагая, что вы говорите о панели действий, тогда да. –

+0

Можете ли вы сказать, что wat - это 'targetSdkVersion', который вы используете для' uses-sdk' в своем приложении? – havexz

ответ

19

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

У меня есть приложение, реализующее свои собственные панели инструментов, которые ведут себя в некоторой степени, как ActionBar. Ну, я сделал это, потому что мое приложение было выпущено с 1.5 sdk. В то время такой концепции нет. И для размещения в моих панелях инструментов я скрываю строку заголовка по умолчанию. Но некоторые действия выполняются через функциональность меню.

Теперь, когда в Galaxy Nexus нет кнопки «Меню», если вы не используете ActionBar, и это вредит мне, потому что мое приложение по-прежнему поддерживает 1.5.

Хорошо, что есть различные работы вокруг, но ни один из них не прост.

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

В вашей ситуации контекстное меню на кнопке не является плохим soln в игре, так как игра будет иметь только один контекст, в котором она работает, по сравнению с контекстным меню в элементах списка, где каждый элемент является другим контекстом.

BTW, если openOptionsMenu работает на ICS, и через некоторое время вы можете вырезать HoneyComb (даже сейчас пользовательская база слишком низкая), попробуйте дать оба меню based on the version.

РЕДАКТИРОВАТЬ: Ну, есть еще один способ также получить кнопку MENU/S в нижней навигационной панели. Просто установите targetSdkVersion меньше 11. Для получения более подробной информации pls read the whole soln.

+0

Предоставление обеих версий может быть целесообразным, хотя я не уверен, как (и будет ли) openOptionsMenu работать для планшетов в ICS. В настоящее время я не могу проверить это, так как эмуляторы размера планшета ICS + не являются друзьями на моей машине разработки. : -/ –

+0

Разработка на планшетах на эмуляторе засасывает большое время ... даже запущенное простое приложение - проблема, у вас есть игра .... ;-). Теперь, чтобы протестировать 'openOptionsMenu' на планшете ICS, попробуйте создать небольшое приложение только для тестирования меню в эмуляторе. Через час или около того ..;), вы узнаете. И если это сработает, вы можете переключаться между двумя меню на основе версии. Возможно, вы захотите создать обработчик для меню, который может быть повторно использован для обоих случаев. – havexz

+0

Я мог бы это сделать, если бы эмулятор даже запустил экземпляр с ICS в размерах таблеток, который до сих пор - это полностью не удалось. Очевидно, что-то связано с использованием ОЗУ, но до сих пор у меня не было времени потратить на попытку заставить это работать. –

2

Однако ICS делает это серьезной проблемой, поскольку кнопка MENU, очевидно, не возвращается.

Более точно, производители устройств должны иметь вне экранные кнопки или нет для таких вещей, как MENU. Указание документа для определения совместимости для Android 4.0:

Функции «Дом», «Меню» и «Назад» имеют важное значение для парадигмы навигации Android. Реализации устройств ДОЛЖНЫ делать эти функции доступными пользователю в любое время при запуске приложений. Эти функции могут быть , реализованные с помощью специальных физических кнопок (таких как механические или емкостные сенсорные кнопки) или МОГУТ быть , реализованных с использованием специальных программных клавиш, жестов, сенсорной панели и т. Д.

Таким образом, вы не можете рассчитывать на то, что имеется кнопка MENU на экране, хотя может быть и одна.

Любые мысли о том, как с этим бороться?

Напишите свое собственное «меню» как часть пользовательского интерфейса игры. Я бы не ожидал, что игра, которая думает, что ей нужен полный экран, чтобы использовать меню опций - на самом деле, я не помню, чтобы когда-либо видел игру, которая сделала это (хотя, по общему признанию, я не игрок большой игры) , Все игры, которые я играл, ничего не делают при нажатии кнопки MENU. Скорее всего, все, что может считаться «меню», реализуется непосредственно в пользовательском интерфейсе игры (например, кнопка, которая приводит к экрану, отформатированному в интерфейсе пользовательского интерфейса игры, который предлагает выбор для действий).

Остановить меню параметров целиком и перейти только к контекстным меню?

Это было бы ужасно, поскольку пользователи не знали, где долго нажать, чтобы открыть меню.

+3

«Реализации устройств ДОЛЖНЫ сделать эти функции доступными пользователю в любое время при запуске приложений». - Это совершенно не имеет смысла, учитывая, что собственный Galaxy Nexus Google НЕ делает этого вообще. –

+1

«Это было бы ужасно, так как пользователи не будут знать, где долго нажать, чтобы открыть меню». Они будут знать, что нажимают на кнопку, в которой указано меню, в котором появляется контекстное меню, а не - как я делаю это сейчас - меню опций, которое появляется только на устройствах без 3.x. –

+0

@MichaelA: У меня есть Galaxy Nexus, и я не помню ситуаций, когда кнопка MENU не видна. Поразмыслить? «нажмите на кнопку, в которой указано меню, в котором появится контекстное меню», - а как же вместо этого, когда они нажимают кнопку, которая говорит «Меню», вы показываете «AlertDialog» с вашими вариантами меню? Или 'PopupWindow'? Или другие вещи, где UX больше под вашим контролем? – CommonsWare

0

Michael, я был в абсолютно такой же ситуации и решил его, выполнив мое меню опций с помощью специального диалога. Это лучше выглядит на ICS, чем в предыдущем меню опций. Он настроен так

minSdkVersion = 8 targetSdkVersion = 14 SDK сборки версии 8 (в затмении settings.could установлен в 14, но мне нравится типобезопасность она предоставляет)

Пользователи с API < 10 использовать жесткую кнопку меню и см. стандартное меню опций. Пользователи с API> = 10 видят значок с тремя точками (меню переполнения) в приложении и при нажатии получают свое настраиваемое диалоговое меню. Они также видят новый вид ICS в настройках и т. Д.

Не похоже, что кнопка меню возвращается, и я хотел сломать прежний барьер, хотя только < 1% моих пользователей использует ICS.

0

В ответе на этот недавний пост в блоге, они, кажется, хотят разработчиков начните использовать Action Bars над меню, но это станет больно, если вы хотите поддерживать API => 3.0 и API < 3.0. Поэтому либо создайте настраиваемую панель действий, совместимую с API < 3.0 (примеры из SDK), либо ... Я экспериментировал с прошлой неделей:

У меня также была проблема, когда кнопка меню не отображается на моем ICS-планшете, я полагаю, что у меня было targetSdk, равным 11 в то время, когда я хотел реализовать ActionBar. Затем я установил minSdk в 3, а targetSdk - 4. Появилась кнопка ActionBar и кнопка переполнения меню. Так что сейчас это обходной путь (по крайней мере, для проекта, над которым я работаю).

-2

Я добавил специальную логику для релизов 3.x. Только для этих выпусков я использую панель действий.

  if (Build.VERSION.SDK_INT == Build.VERSION_CODES.HONEYCOMB 
      || Build.VERSION.SDK_INT == Build.VERSION_CODES.HONEYCOMB_MR1 
      || Build.VERSION.SDK_INT == Build.VERSION_CODES.HONEYCOMB_MR2) { 
       requestWindowFeature(Window.FEATURE_ACTION_BAR);   
      } 
      else{ 
//    hide the status bar, do not use action bar   
       requestWindowFeature(Window.FEATURE_NO_TITLE);  
       getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);    
      } 

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

act.openOptionsMenu(); 

В рамках вашего меню XML, убедитесь, чтобы иметь такую ​​строку, чтобы установить «showAsAction»

showAsAction="ifRoom" 
+0

это не сработало для меня –