Intereting Posts
Использование андроид-анимационного списка Phonegap / Cordova – TypeError: Результат выражения 'navigator.network' не является объектом Как я могу избежать задержек сбора мусора в Java-играх? (Best Practices) Как изменить размер изображения gif в android Невозможно переопределить конечный метод из ActionBarActivity Ошибка обновления sdk 3D-рендеринг объектов в openCV с использованием metaio в Android Внедрение правильной обратной навигации и управление домашней кнопкой с помощью панели инструментов в Android Результаты проекта Firebase в ошибке «Ошибка авторизации / отказа от сети» при входе в систему Android, Xamarin Forms PCL, PortableRest PCL и Async Web Api Call Как импортировать внешнюю библиотеку в студию Android? Android – индекс для ListView? Использование намерения использовать камеру на Android Как удалить предыдущую запись стека из FragmentManager? Фрагмент без просмотра сбоев при изменении конфигурации

Как создать экземпляр меню программно? Т.е. раздуть меню снаружи 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