如何使用ActionMenuView?

时间:2015-01-16 16:25:00

标签: android actionmenuview

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

我知道我可以在布局文件中添加ActionMenuView,但我不知道如何添加菜单项。我似乎不能像使用SplitActionBar那样给他们充气。

你能提供一些关于如何使用ActonMenuView的示例代码吗?谢谢!

5 个答案:

答案 0 :(得分:13)

获取动作菜单以显示整个屏幕的图标宽度是一件苦差事。这是一个做你想做的事的例子。确保您的ActionMenuView XML项目的高度和宽度为wrap_content,然后是右侧的重力。将它包围在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小时才能使其工作。文档很垃圾。

答案 1 :(得分:9)

在此期间,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);

答案 2 :(得分:1)

如果您使用的是v7 appCompat库,请确保您的活动从ActionBarActivity延伸,并使用ActionMenuView的支持版本。

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

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

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

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

答案 3 :(得分:0)

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

如果您的弹出主题被忽略,请务必在setPopupTheme(int)上对getMenu()的任何来电之前致电ActionMenuView

答案 4 :(得分: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
        }
    }