使用自定义操作视图时,不会调用onOptionsItemSelected

Sia*_*ash 17 android

我为我的一个操作栏MenuBar设置了一个自定义视图

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.loop_thread, menu);
        ImageView iv = (ImageView)(getLayoutInflater().inflate(R.layout.image_container, null));
        menu.findItem(R.id.action_filter).setActionView(iv);
        ...
Run Code Online (Sandbox Code Playgroud)

但是当我在我的应用程序中点击该菜单项时,onOptionsItemSelected()不会被调用.(我已经通过在方法开头设置断点来验证这一点).如果我点击其他按钮,在操作栏中,会调用onOptionsItemSelected().

这是自定义视图的xml代码:

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ibtnFilterMenu"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@android:color/darker_gray"
    android:src="@drawable/btn_action_down_arrow"
    style = "@android:style/Widget.ActionButton"/>
Run Code Online (Sandbox Code Playgroud)

我也尝试在菜单xml文件上设置Action视图:

    <item android:id="@+id/action_filter"
    android:title="@string/filter_options"
    android:actionLayout="@layout/image_container"
    android:orderInCategory="100"
    android:showAsAction="ifRoom" />
Run Code Online (Sandbox Code Playgroud)

注:我知道我可以使图像可点击,并手动设置onClickListener它,但对于学习的缘故,我想要去的这条底线.

Sia*_*ash 29

似乎膨胀和绘制操作项的底层代码不会连接由setActionView()或由其设置的自定义布局的内容android:actionLayout="@layout/image_container".

可能是因为布局可以是任何东西,只是一个按钮或图像.所以我必须手动设置onClickListener图标.出于组织的目的,我只是onOptionsItemSelected()OnClick我的图标方法调用,但我可以在onClick方法中定义动作.

首先,在你的中声明filterMenuItem Activity.

MenuItem filterMenuItem;

public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.loop_thread, menu);
    filterMenuItem = menu.findItem(R.id.action_filter);

    filterMenuItem.getActionView().setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            MainActivity.this.onOptionsItemSelected(filterMenuItem);
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 在onClick方法中,你应该调用onMenuItemSelected(0,filterMenuItem); 相反,如果你想通过活动片段中的实现传播对onOptionsItemSelected的调用. (4认同)
  • 是的,这取决于你在自定义布局中的内容.如果你想要涟漪效果,只需在你的image/imageButton上使用`android:background ="?attr/selectableItemBackground"` (2认同)