如何使用ActionMenuView?
How to use ActionMenuView?
由于Android5.0不再支持SplitActionBar,我尝试使用ActionMenuView来实现SplitActionBar的效果。但是我找不到太多关于如何使用 ActionMenuView 的信息。
我知道我可以在布局文件中添加一个ActionMenuView,但我不知道如何添加菜单项。似乎我无法像使用 SplitActionBar 那样给它们充气。
能否提供一些关于如何使用 ActonMenuView 的示例代码?谢谢!
如果您使用的是 v7 appCompat 库,请确保您的 activity 扩展自 ActionBarActivity
并且您使用 ActionMenuView
.
的支持版本
同样,如果您不使用支持库,请务必使用支持库之外的ActionMenuView
。
从那里您可以从布局中获取 ActionMenuView
并使用以下方法填充其菜单:
getMenuInflater().inflate(R.menu.your_menu_here, actionMenuView.getMenu())
如果您不在可以访问 getMenuInflater()
的 activity 中,请创建您自己的 MenuInflater
或 SupportMenuInflater
。
让 ActionMenuView
显示整个屏幕宽度的图标是一件苦差事。这是一个做你想做的事的例子。确保您的 ActionMenuView
XML 项目的高度和宽度是 wrap_content
,然后是右侧的 gravity
。用 LinearLayout
包围它,占据整个宽度并提供背景颜色。
使用此代码初始化 ActionMenuView
(显然您需要更改按钮回调)
ActionMenuView actionMenuView = (ActionMenuView) findViewById(R.id.editBar);
final Context context = this;
MenuBuilder menuBuilder = new MenuBuilder(context);
menuBuilder.setCallback(new MenuBuilder.Callback() {
@Override
public boolean onMenuItemSelected(MenuBuilder menuBuilder, MenuItem menuItem) {
return onOptionsItemSelected(menuItem);
}
@Override
public void onMenuModeChange(MenuBuilder menuBuilder) {
}
});
// setup a actionMenuPresenter which will use up as much space as it can, even with width=wrap_content
ActionMenuPresenter presenter = new ActionMenuPresenter(context);
presenter.setReserveOverflow(true);
presenter.setWidthLimit(getResources().getDisplayMetrics().widthPixels, true);
presenter.setItemLimit(Integer.MAX_VALUE);
// open a menu xml into the menubuilder
getMenuInflater().inflate(R.menu.editbar, menuBuilder);
// runs presenter.initformenu(mMenu) too, setting up presenter's mmenu ref... this must be before setmenuview
menuBuilder.addMenuPresenter(presenter, this);
// runs menuview.initialize too, so menuview.mmenu = mpresenter.mmenu
actionMenuView.setPresenter(presenter);
presenter.updateMenuView(true);
为了它的价值,我不得不阅读支持库源代码 8 个小时才能让它工作。文档是垃圾。
似乎 API 同时发生了变化。目前,以下代码有效:
ActionMenuView actions = new ActionMenuView(activity);
MenuBuilder menuBuilder = (MenuBuilder) actions.getMenu();
menuBuilder.setCallback(new MenuBuilder.Callback() {
@Override
public boolean onMenuItemSelected(MenuBuilder menuBuilder, MenuItem menuItem) {
return onOptionsItemSelected(menuItem);
}
@Override
public void onMenuModeChange(MenuBuilder menuBuilder) {
}
});
inflater.inflate(R.menu.my_menu, menuBuilder);
在appcompat-v7:27.0.2
中,ActionMenuView
要求最小宽度为56dp
。不要使用 android:layout_width="wrap_content"
.
如果您的弹出式主题被忽略,请确保在 ActionMenuView
上调用 getMenu()
之前先调用 setPopupTheme(int)
。
膨胀
您可以在 activity 中使用此代码:
menuInflater.inflate(R.menu.{your_menu_res_id}, {your_ActionMenuView_instance}.menu)
像这样:
menuInflater.inflate(R.menu.settings_menu, settings_menu.menu)
项目点击监听器
然后你可以添加项目点击监听器:
{your_ActionMenuView_instance}.setOnMenuItemClickListener()
像这样:
settings_menu.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.menu_settings_save -> {
// your code
return@setOnMenuItemClickListener true
}
else -> return@setOnMenuItemClickListener false
}
}
由于Android5.0不再支持SplitActionBar,我尝试使用ActionMenuView来实现SplitActionBar的效果。但是我找不到太多关于如何使用 ActionMenuView 的信息。
我知道我可以在布局文件中添加一个ActionMenuView,但我不知道如何添加菜单项。似乎我无法像使用 SplitActionBar 那样给它们充气。
能否提供一些关于如何使用 ActonMenuView 的示例代码?谢谢!
如果您使用的是 v7 appCompat 库,请确保您的 activity 扩展自 ActionBarActivity
并且您使用 ActionMenuView
.
同样,如果您不使用支持库,请务必使用支持库之外的ActionMenuView
。
从那里您可以从布局中获取 ActionMenuView
并使用以下方法填充其菜单:
getMenuInflater().inflate(R.menu.your_menu_here, actionMenuView.getMenu())
如果您不在可以访问 getMenuInflater()
的 activity 中,请创建您自己的 MenuInflater
或 SupportMenuInflater
。
让 ActionMenuView
显示整个屏幕宽度的图标是一件苦差事。这是一个做你想做的事的例子。确保您的 ActionMenuView
XML 项目的高度和宽度是 wrap_content
,然后是右侧的 gravity
。用 LinearLayout
包围它,占据整个宽度并提供背景颜色。
使用此代码初始化 ActionMenuView
(显然您需要更改按钮回调)
ActionMenuView actionMenuView = (ActionMenuView) findViewById(R.id.editBar);
final Context context = this;
MenuBuilder menuBuilder = new MenuBuilder(context);
menuBuilder.setCallback(new MenuBuilder.Callback() {
@Override
public boolean onMenuItemSelected(MenuBuilder menuBuilder, MenuItem menuItem) {
return onOptionsItemSelected(menuItem);
}
@Override
public void onMenuModeChange(MenuBuilder menuBuilder) {
}
});
// setup a actionMenuPresenter which will use up as much space as it can, even with width=wrap_content
ActionMenuPresenter presenter = new ActionMenuPresenter(context);
presenter.setReserveOverflow(true);
presenter.setWidthLimit(getResources().getDisplayMetrics().widthPixels, true);
presenter.setItemLimit(Integer.MAX_VALUE);
// open a menu xml into the menubuilder
getMenuInflater().inflate(R.menu.editbar, menuBuilder);
// runs presenter.initformenu(mMenu) too, setting up presenter's mmenu ref... this must be before setmenuview
menuBuilder.addMenuPresenter(presenter, this);
// runs menuview.initialize too, so menuview.mmenu = mpresenter.mmenu
actionMenuView.setPresenter(presenter);
presenter.updateMenuView(true);
为了它的价值,我不得不阅读支持库源代码 8 个小时才能让它工作。文档是垃圾。
似乎 API 同时发生了变化。目前,以下代码有效:
ActionMenuView actions = new ActionMenuView(activity);
MenuBuilder menuBuilder = (MenuBuilder) actions.getMenu();
menuBuilder.setCallback(new MenuBuilder.Callback() {
@Override
public boolean onMenuItemSelected(MenuBuilder menuBuilder, MenuItem menuItem) {
return onOptionsItemSelected(menuItem);
}
@Override
public void onMenuModeChange(MenuBuilder menuBuilder) {
}
});
inflater.inflate(R.menu.my_menu, menuBuilder);
在appcompat-v7:27.0.2
中,ActionMenuView
要求最小宽度为56dp
。不要使用 android:layout_width="wrap_content"
.
如果您的弹出式主题被忽略,请确保在 ActionMenuView
上调用 getMenu()
之前先调用 setPopupTheme(int)
。
膨胀
您可以在 activity 中使用此代码:
menuInflater.inflate(R.menu.{your_menu_res_id}, {your_ActionMenuView_instance}.menu)
像这样:
menuInflater.inflate(R.menu.settings_menu, settings_menu.menu)
项目点击监听器
然后你可以添加项目点击监听器:
{your_ActionMenuView_instance}.setOnMenuItemClickListener()
像这样:
settings_menu.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.menu_settings_save -> {
// your code
return@setOnMenuItemClickListener true
}
else -> return@setOnMenuItemClickListener false
}
}