Intereting Posts
Android SDK Manager не может загружать новые файлы Поместите изображение внутри webview и установите его ширину Как найти версию процессора ARM на устройстве Android? Как извлечь данные из статьи в Википедии? Переход Android Shared Element: преобразование ImageView из круга в прямоугольник и обратно Как получить силу сигнала сотовой связи в Android? Android: обнаружение другого приложения начало воспроизводить аудио Включение программного обеспечения Как удалить значки из меню переполнения ActionBarSherlock на Android 2.3? Как заблокировать всплывающее меню при нажатии на флажок Android 4.4.2 обратный привязку к MacBook Air через Bluetooth PAN – не подключение к Интернету Throwable: Не удалось создать SD-карту FloatingActionButton, квадратная кнопка ниже уровня API 17 Метод onDraw () расширенного SurfaceView никогда не вызывал Панель действий Android, как добавить поддерживающую библиотеку v7 appcompat для Eclipse

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