iTe*_*ech 34 android menu menuitem android-layout
我想在 onCreateOptionsMenu方法外面扩展一个菜单对象(这意味着当用户没有按下按钮时创建/显示菜单),所以我需要创建一个菜单实例来将它传递给inflate方法.
这是我想要实现的一个例子:
Menu menu = // How to create an instance !?
new MenuInflater(context).inflate(R.menu.my_menu, menu)
Run Code Online (Sandbox Code Playgroud)
Menu是一个接口,所以我需要知道哪个类正在实现它.我确实浏览了Android代码以获取有关如何创建Menu对象的任何提示,但仍无法找到我要查找的内容.
编辑1
我的目标是onOptionsItemSelected(MenuItem item)从自定义视图中触发事件,该事件将由活动处理,因此我需要一个具有特定itemId和title的MenuItem对象以将其传递给事件.
如果我可以成功创建一个Menu对象,那么很容易获得它的子菜单MenuItems.
编辑2
我根本不想显示菜单,我想要的是使用菜单XML中定义的元素填充ListView,其中包含title,icon和itemId,每当单击ListViewItem时,我想触发在我处理的事件活动.onOptionsItemSelected(MenuItem item)
我知道我可以解析菜单XML以提取项目信息,但是如果onOptionsItemSelected(MenuItem item)不创建标准的 MenuItem对象来将其作为参数传递,我将无法触发.
任何帮助将不胜感激.谢谢!
Mus*_*sma 41
这是获取Menu实例的技巧:
PopupMenu p = new PopupMenu(getContext(), null);
Menu menu = p.getMenu();
Run Code Online (Sandbox Code Playgroud)
iTe*_*ech 28
我找到了两个以编程方式创建Menu实例并对其进行充气的解决方案:
使用ActionbarSherlock库或AppCompat v7库 Menu menu = new MenuBuilder(context);,您也可以编写自己的MenuBuilder类
使用标准的android SDK:
//通过反射创建实例
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;
}
Run Code Online (Sandbox Code Playgroud)
拥有Menu实例后,您可以轻松地从程序中的任何位置的菜单XML资源中对其进行充气
new MenuInflater(context).inflate(menuId, menu);
我测试了这两种方法,它们是完美的工作,我会建议使用第二种方法与标准Menu和MenuItem等级从Android SDK中,即使你的活动来延长SherlockActivity因为它仍然会收到onOptionsItemSelected(MenuItem item)不管你火了android.view.MenuItem或com.actionbarsherlock.view.MenuItem
我不确定为什么这不是一个答案,我知道这是一个老问题,但对于未来的读者..
如果你只是这样做:
val menu = MenuBuilder(context)
MenuInflater(context).inflate(R.menu.menu_XXXX, menu)
Run Code Online (Sandbox Code Playgroud)
androidx.appcompat.view.menu.MenuBuilder实施android.view.Menu. 经检查,仅此PopupMenu而已。
请注意,com.android.internal.view.menu.MenuBuilder@iTech 提到的和使用的PopupMenu不是公开的,不应使用。
fun Context.inflateMenu(@MenuRes menuRes: Int): Lazy<MenuBuilder> = lazy {
MenuBuilder(this)
.also { MenuInflater(this).inflate(menuRes, it) }
}
fun Fragment.inflateMenu(@MenuRes menuRes: Int): Lazy<MenuBuilder> = lazy {
MenuBuilder(context)
.also { MenuInflater(context).inflate(menuRes, it) }
}
Run Code Online (Sandbox Code Playgroud)
class MyActivity : AppCompatActivity(R.layout.activity_my) {
val menu by inflateMenu(R.menu.menu_my)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
}
}
Run Code Online (Sandbox Code Playgroud)
class MyFragment : Fragment(R.layout.fragment_my) {
val menu by inflateMenu(R.menu.menu_my)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
...
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22249 次 |
| 最近记录: |