16

由于 Android 5.0 不再支持 SplitActionBar,因此我尝试使用 ActionMenuView 来实现 SplitActionBar 效果。但是我找不到太多关于如何使用 ActionMenuView 的信息。

我知道我可以在布局文件中添加一个 ActionMenuView,但我不知道如何添加菜单项。看起来我不能像使用 SplitActionBar 那样给它们充气。

您能否提供一些有关如何使用 ActonMenuView 的示例代码?谢谢!

4

5 回答 5

15

ActionMenuView显示整个屏幕宽度的图标是一件苦差事。这是一个做你想做的事的例子。确保您的ActionMenuViewXML 项目是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 小时才能让它工作。文档是垃圾。

于 2015-04-12T16:09:40.987 回答
10

与此同时,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);
于 2015-11-05T17:54:20.137 回答
1

如果您使用的是 v7 appCompat 库,请确保您的活动扩展自ActionBarActivity并使用支持版本的ActionMenuView.

同样,如果您不使用支持库,请务必使用ActionMenuView外部支持库。

从那里您可以ActionMenuView从您的布局中获取并使用以下方法填充其菜单:

getMenuInflater().inflate(R.menu.your_menu_here, actionMenuView.getMenu())

如果您不在getMenuInflater()可访问的活动中,请创建自己的MenuInflaterSupportMenuInflater.

于 2015-03-10T17:34:51.023 回答
0

膨胀

您可以在活动中使用此代码:

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
        }
    }
于 2021-06-21T09:37:41.910 回答
0

appcompat-v7:27.0.2中,ActionMenuView需要的最小宽度为56dp。不要使用android:layout_width="wrap_content".

如果您的弹出主题被忽略,请确保在调用onsetPopupTheme(int)之前先调用。getMenu()ActionMenuView

于 2018-01-23T20:13:42.173 回答