Intereting Posts
Объявление пространства имен Xml: имя пакета автозамены Когда заканчиваются токены GCM и что такое идентификатор экземпляра? Android Native Browser, дублирующий холст HTML5 (тонкий хром) ActionBar BUG: Навигация в режиме списка не отображается после использования SearchView Скрыть виджет приложения в зависимости от уровня API Позиционирование изображения внутри ImageView с помощью силы тяжести: верх Android AudioRecord class – быстро запускает звук в реальном времени, настраивает функцию обратного вызова Приложение всегда запускается из корневой активности, а не возобновляет фоновое состояние (известная ошибка) Обнаружение направления прокрутки в адаптере (вверх / вниз) Некоторые стили ProgressBar не показаны на Nexus 5 Android 5.0.1 Как приложение Android выполняется на виртуальной машине Dalvik. Android и (миллионы) push-уведомлений Внедрить инфраструктуру Microsoft Sync с устройством Android Android Lollipop – Потяните, чтобы обновить Видео YouTube не воспроизводится в WebView – 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