Intereting Posts
Как оживить изменение текста в TextView? Проблема с 9 патч-изображением в качестве фона Не удалось запустить Android Studio Выбор цвета Google Calendar «R не может быть разрешено для переменной» – папка «gen» пуста Android: как перевести приложение на разные языки и продавать на рынке? Настраивать эмуляцию / ориентацию устройства программно в контрольно-измерительном тесте Андроид, как узнать, когда потеряно интернет-соединение? Нет кэшированной версии com.android.tools.build:gradle:0.9.1 для автономного режима FindClass из любого потока в Android JNI Уточнение в отношении Android «Высота атрибута используется только в API уровня 21 и выше» Как переопределить поведение кнопок громкости в приложении Android? Не удается разрешить класс привязки данных Android Почему мое приложение в списке приложений не открывает файл txt? Проблема с URI приложения для электронной почты Gmail для Android

Как создать экземпляр меню программно? Т.е. раздуть меню снаружи onCreateOptionsMenu

Я хочу раздуть объект меню вне метода onCreateOptionsMenu (что означает создание / отображение меню, когда пользователь не нажимает кнопку), поэтому мне нужно создать экземпляр меню, чтобы передать его методу раздувания.

Вот пример того, чего я пытаюсь достичь:

 Menu menu = // How to create an instance !? new MenuInflater(context).inflate(R.menu.my_menu, menu) 

Меню – это интерфейс, поэтому мне нужно знать, какой класс его реализует. Я просмотрел Android-код, чтобы получить какой-либо намек на то, как создается объект Menu, но не смог найти то, что я ищу.

Редактировать 1

Моя цель – запустить событие onOptionsItemSelected(MenuItem item) из пользовательского представления, которое будет обрабатываться с помощью действия, поэтому мне нужно, чтобы объект MenuItem с определенным itemId и названием передавал его с событием.

Если я могу успешно создать объект Menu, будет легко получить его дочерние элементы MenuItems.

Изменить 2

Я вообще не пытаюсь отобразить меню, я хочу заполнить ListView элементами, определенными в XML-меню, которые имеют заголовок, значок и itemId, и всякий раз, когда щелкнут ListViewItem, я хочу запустить onOptionsItemSelected(MenuItem item) Который обрабатывается в моей деятельности.

Я знаю, что могу анализировать XML-меню для извлечения информации о элементах, однако я не смогу запустить onOptionsItemSelected(MenuItem item) без создания стандартного объекта MenuItem для передачи его в качестве аргумента.

Любая помощь будет оценена по достоинству. Благодаря!

Solutions Collecting From Web of "Как создать экземпляр меню программно? Т.е. раздуть меню снаружи onCreateOptionsMenu"

Вот трюк, чтобы получить экземпляр Menu:

 PopupMenu p = new PopupMenu(getContext(), null); Menu menu = p.getMenu(); 

Я нашел два решения программно создать экземпляр меню и раздуть его:

  • Использование библиотеки ActionbarSherlock или библиотеки AppCompat v7 Menu menu = new MenuBuilder(context); Или вы можете написать свой собственный класс MenuBuilder

  • Использование стандартного SDK для Android:

// Создание экземпляра путем отражения

 Menu menu = newMenuInstance(context); protected Menu newMenuInstance(Context context) { try { Class<?> menuBuilderClass = Class.forName("com.android.internal.view.menu.MenuBuilder"); Constructor<?> constructor = menuBuilderClass.getDeclaredConstructor(Context.class); return (Menu) constructor.newInstance(context); } catch (Exception e) {e.printStackTrace();} return null; } 

Когда у вас есть экземпляр меню, вы можете легко раздуть его из XML-ресурса меню в любой точке вашей программы

new MenuInflater(context).inflate(menuId, menu);

Я тестировал оба метода, и они работают отлично, я бы рекомендовал использовать второй метод со стандартными классами Menu и MenuItem из SDK Android, даже если ваша активность расширяет SherlockActivity, потому что он все равно получит onOptionsItemSelected(MenuItem item) независимо от того, onOptionsItemSelected(MenuItem item) ли вы его с помощью android.view.MenuItem или com.actionbarsherlock.view.MenuItem

Вам не нужно ничего делать с инфлятором, чтобы добавить свои собственные меню. Просто переопределите onCreateOptionsMenu и начните добавлять свои собственные объекты в объект меню . Например:

 @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(0, 1, Menu.NONE, "First"); menu.add(0, 2, Menu.NONE, "Second"); // repeat this to add additional menus return true; } 

Второй аргумент в методе добавления – это id . Используйте уникальные идентификаторы для идентификации выбранного пункта меню.

Вы можете вытащить экземпляр MenuBuilder (который реализует интерфейс меню), хранящийся в PhoneWindow, который используется в Activity. У меня есть рабочее решение, оно использует Java Reflection.

Я создал один проект «InDroid», чтобы выставить несколько важных скрытых методов, переменные с платформы Android – http://code.google.com/p/indroid/

BR, Prasanta