Intereting Posts
Как я могу открыть дозвон с номером телефона? Разница между фрагментомTransaction.add и фрагментомTransaction.replace Android: приложение часто сбой при мгновенном запуске Android 4.0 – API-уровень 14 против API Google (Google Inc.) – API-уровень 14: В чем разница? Пользовательский (градиентный) фон ActionBar Ошибка eclipse с плагинами после обновления Приложение Android запоминает свои данные после удаления и переустановки SetRequestedOrientation перед показом ProgressDialog приводит к сбою Способ получить разблокировку в андроиде? Закончить активность после сообщения тоста исчезает? Включение нескольких событий в календарь Android Как использовать поставщика контента SMS? Где документы? Android: как воссоздать панель действий при изменении фрагмента Эффекты изображения с вращением и щепоткой для увеличения с помощью GLSurfaceView 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