如何在MenuItem上设置长按一下监听器(在NavigationView上)?

Tho*_*Vos 12 android android-menu android-navigationview

如何设置长按一下监听器MenuItem

我试过这个答案,但这个方法对我来说并不存在.有解决方案吗

码:

Menu menu = navigationView.getMenu();
MenuItem menuItem = menu.findItem(R.id.menu_item);

// TODO set a long click listener on the menuItem.
menuItem.setOnLongClickListener(...); // Method does not exist, any other solutions?
Run Code Online (Sandbox Code Playgroud)

编辑:我不想设置自定义ActionView,我想要长整型监听器MenuItem,而不需要自定义视图.

cep*_*3us 6

许多方法中的一种(假设我们使用工具栏) - 这个例子应该让您了解如何实现长按工具栏按钮:

class MyActivity extends Activity {    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        /** get menu inflater */
        MenuInflater menuInflater = getMenuInflater();
        /** Inflate the menu
         * this adds items to the action bar if it is present. */
        menuInflater.inflate(R.menu.menu_home, menu);
        /** find interesting item */
        MenuItem item = menu.findItem(R.id.itemId);
        /** set action view */
        item.setActionView(new ImageButton(this)); // this is a Context.class object
        /** set listener  on action view */
        item.getActionView().setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                return false;
            }
        });

        return super.onCreateOptionsMenu(menu);
    }
}
Run Code Online (Sandbox Code Playgroud)

在方法onCreateOptionsMenu - 或任何其他方法,当您可以获得菜单项引用(省略步骤1-2):

  1. 创建菜单/例如通过膨胀
  2. 获取菜单项
  3. 创建动作视图,例如ImageButton
  4. 在动作视图上设置长按侦听器
  5. 在菜单项上设置动作视图

上面我设置了一个动作视图,然后我从菜单项中取回并设置了监听器(顺序无论是否也可以这样):

ImageButton imageButton = new ImageButton(Context);
imageButton.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                return false;
            }
        });
item.setActionView(imageButton);
Run Code Online (Sandbox Code Playgroud)

PS.您还可以在xml中将图像视图设置为菜单项上的属性:

 <item
    ... 
    android:actionViewClass="android.widget.ImageButton"
 />

then you can get the action view by cast 

   View menuItemActionView = menu.findItem(R.id.itemId).getActionView();
   if(menuItemActionView != null 
            && ImageButton.class.isAssignableFrom(menuItemActionView.getCLass())) {
        ImageButton imageButton = (ImageButton) menuItemActionView;
   }
Run Code Online (Sandbox Code Playgroud)

但是,您只需将长按侦听器设置为操作视图,而不是整个项目. - SuperThomasLab

- 在这种情况下,您没有在单个元素上设置操作视图,您更改了菜单项的默认视图(到ImageButton小部件) - 操作视图可以是简单或复杂的视图类型

但是,如果您不想更改视图,但保留默认视图呢? - SuperThomasLab

示例(通过使用布局树观察器 /通过设置布局更改侦听器,这是许多方法之一):

    private View.OnLongClickListener onLongClickListener = new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            return false;
        }
    };


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        /** get menu inflater */
        MenuInflater menuInflater = getMenuInflater();
        /** Inflate the menu
         * this adds items to the action bar if it is present. */
        menuInflater.inflate(R.menu.menu_home, menu);
        /** geta menu item using findItem(int itemid) */
        MenuItem item = menu.findItem(R.id.itemLogOut);
        /** check if we have item */
        if(item!=null) {
            /** try get its action view */
            View actionView = item.getActionView();
             /** check if action view is already set? */
            if(actionView==null) {
                /** get item id  to comparte later in observer listener*/
                final int itemId = item.getItemId();
                /** if not set on top most window an layout changes listener */
                getWindow().getDecorView()
                           .addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
                    @Override
                    public void onLayoutChange(View v, int left, int top, int right, 
                      int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                           /** try get view by id we have stored few line up */
                           View viewById = v.getRootView().findViewById(itemId);
                           /** check if we have any result */
                           if(viewById!=null) {
                                /** set our listener */                     
                                viewById.setOnLongClickListener(onLongClickListener);
                                /** remove layout observer listener */
                                v.removeOnLayoutChangeListener(this);
                           }
                    }
                });
            } else {
                /** if set we can add our on long click listener */
                actionView.setOnLongClickListener(onLongClickListener);
            }
        }
  } 
Run Code Online (Sandbox Code Playgroud)

我尝试了OnLayoutChangeListener,但它仍然无法正常工作. - SuperThomasLab

是的它 - 但我知道为什么它不适合你的情况??? - 在我的示例中,如果菜单视图布局,我们检查是否布置了视图项而不是该更改,然后检查菜单是否包含项

这是工作代码供您学习:

https://github.com/c3ph3us/LongClickOnMenuItem

回复其他意见:

@ SuperThomasLab对我来说,为什么setOnLongClickListener(...)方法不适合你并不明显. - Hossein Seifi

@HosseinSeifi - 看看android.view.MenuItem接口 - 它没有提供这样的方法 - 所以对于优秀的程序员来说这应该是显而易见的:)为什么他无法达到实现类方法.

  • 我相信这里提供的解决方法是实现此功能的唯一方法.如果不提供自己的ActionView或treeview解决方案,我认为你不能长时间工作.理想情况下,默认的MenuItem上的getActionView()和设置长按一下监听器才会起作用,但Android有时很糟糕:-( (2认同)