由于 Android 5.0 不再支持 SplitActionBar,因此我尝试使用 ActionMenuView 来实现 SplitActionBar 效果。但是我找不到太多关于如何使用 ActionMenuView 的信息。
我知道我可以在布局文件中添加一个 ActionMenuView,但我不知道如何添加菜单项。看起来我不能像使用 SplitActionBar 那样给它们充气。
您能否提供一些有关如何使用 ActonMenuView 的示例代码?谢谢!
由于 Android 5.0 不再支持 SplitActionBar,因此我尝试使用 ActionMenuView 来实现 SplitActionBar 效果。但是我找不到太多关于如何使用 ActionMenuView 的信息。
我知道我可以在布局文件中添加一个 ActionMenuView,但我不知道如何添加菜单项。看起来我不能像使用 SplitActionBar 那样给它们充气。
您能否提供一些有关如何使用 ActonMenuView 的示例代码?谢谢!
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);
如果您使用的是 v7 appCompat 库,请确保您的活动扩展自ActionBarActivity
并使用支持版本的ActionMenuView
.
同样,如果您不使用支持库,请务必使用ActionMenuView
外部支持库。
从那里您可以ActionMenuView
从您的布局中获取并使用以下方法填充其菜单:
getMenuInflater().inflate(R.menu.your_menu_here, actionMenuView.getMenu())
如果您不在getMenuInflater()
可访问的活动中,请创建自己的MenuInflater
或SupportMenuInflater
.
您可以在活动中使用此代码:
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
}
}
在appcompat-v7:27.0.2
中,ActionMenuView
需要的最小宽度为56dp
。不要使用android:layout_width="wrap_content"
.
如果您的弹出主题被忽略,请确保在调用onsetPopupTheme(int)
之前先调用。getMenu()
ActionMenuView