如何在 MenuItem(在 NavigationView 上)上设置长按侦听器? [英] How to set a long click listener on a MenuItem (on a NavigationView)?

查看:45
本文介绍了如何在 MenuItem(在 NavigationView 上)上设置长按侦听器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何在 MenuItem 上设置长按监听器?

我尝试了这个答案,但我不存在该方法.有什么解决办法吗?

代码:

Menu menu = navigationView.getMenu();MenuItem menuItem = menu.findItem(R.id.menu_item);//TODO 在 menuItem 上设置一个长按监听器.menuItem.setOnLongClickListener(...);//方法不存在,还有其他解决方案吗?

我不想设置自定义的 ActionView,我想要整个 MenuItem 的长按监听器,没有自定义视图.

解决方案

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

class MyActivity 扩展 Activity {@覆盖公共布尔 onCreateOptionsMenu(菜单菜单){/** 获取菜单充气器 */MenuInflater menuInflater = getMenuInflater();/** 给菜单充气* 如果它存在,这会将项目添加到操作栏.*/menuInflater.inflate(R.menu.menu_home, menu);/** 找到有趣的项目 */MenuItem item = menu.findItem(R.id.itemId);/** 设置动作视图 */item.setActionView(new ImageButton(this));//这是一个 Context.class 对象/** 在动作视图上设置监听器 */item.getActionView().setOnLongClickListener(new View.OnLongClickListener() {@覆盖公共布尔 onLongClick(查看 v){返回假;}});返回 super.onCreateOptionsMenu(menu);}}

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

  1. 创建菜单/例如通过充气
  2. 获取菜单项
  3. 创建操作视图,例如 ImageButton
  4. 在动作视图上设置长按监听器
  5. 在菜单项上设置一个动作视图

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

ImageButton imageButton = new ImageButton(Context);imageButton.setOnLongClickListener(new View.OnLongClickListener() {@覆盖公共布尔 onLongClick(查看 v){返回假;}});item.setActionView(imageButton);

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

 

<块引用>

但是随后您将长按侦听器设置为仅操作视图,而不是整个项目.– SuperThomasLab

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

<块引用>

但是如果您不想更改视图,而是保留默认视图怎么办?– SuperThomasLab

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

 private View.OnLongClickListener onLongClickListener = new View.OnLongClickListener() {@覆盖公共布尔 onLongClick(查看 v){返回假;}};@覆盖公共布尔 onCreateOptionsMenu(菜单菜单){/** 获取菜单充气器 */MenuInflater menuInflater = getMenuInflater();/** 给菜单充气* 如果它存在,这会将项目添加到操作栏.*/menuInflater.inflate(R.menu.menu_home, menu);/** 使用 findItem(int itemid) 获取菜单项 */MenuItem item = menu.findItem(R.id.itemLogOut);/** 检查我们是否有项目 */如果(项目!=空){/** 尝试获取其动作视图 */查看 actionView = item.getActionView();/** 检查动作视图是否已经设置?*/如果(动作视图==空){/** 稍后在观察者侦听器中获取要比较的项目 ID*/final int itemId = item.getItemId();/** 如果没有设置在最顶部的窗口,则布局更改侦听器 */getWindow().getDecorView().addOnLayoutChangeListener(new View.OnLayoutChangeListener() {@覆盖public void onLayoutChange(View v, int left, int top, int right,int 底部,int oldLeft,int oldTop,int oldRight,int oldBottom) {/** 尝试通过 id 获取视图,我们已经存储了一些行 */查看 viewById = v.getRootView().findViewById(itemId);/** 检查我们是否有任何结果 */如果(viewById!=null){/** 设置我们的监听器 */viewById.setOnLongClickListener(onLongClickListener);/** 移除布局观察者监听器 */v.removeOnLayoutChangeListener(this);}}});} 别的 {/** 如果设置,我们可以添加我们的长按监听器 */actionView.setOnLongClickListener(onLongClickListener);}}}

<块引用>

我尝试了 OnLayoutChangeListener,但它仍然不起作用 什么都没有改变.– SuperThomasLab

是的 - 但我知道它在你的情况下不起作用的原因???- 在我的示例中,我们检查视图项是否已布局,而不是在菜单视图已布局的情况下进行更改,然后检查菜单是否包含项

这里有工作代码供您学习:

https://github.com/c3ph3us/LongClickOnMenuItem

回复其他评论:

<块引用>

@ SuperThomasLab 为什么 setOnLongClickListener(...) 方法对您不可用,对我来说并不明显.– 侯赛因·赛菲

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

How can I set a long click listener on a MenuItem?

I tried this answer, but the method doesn't exist for me. Any solutions?

Code:

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?

Edit: I don't want to set a custom ActionView, I want the long click listener to the whole MenuItem, without a custom View.

解决方案

one of many ways (assuming we use Toolbar) - this example should give you the idea how to implement long click on toolbar button :

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);
    }
}

in method onCreateOptionsMenu - or any other method when you can get menu item reference (omit step 1-2):

  1. create menu / for example by inflate
  2. get menu item
  3. create action view for example ImageButton
  4. set long click listener on action view
  5. set on menu item an action view

above i set an action view then i get it back from menu item and set listener (the order is no matter it could be also in such way):

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

ps. you can also set image view in xml as attribute on menu item:

 <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;
   }

But then you set the long click listener to the action view only, not the whole item. – SuperThomasLab

-- no you are setting an action view on single element in this case you change a default view (to ImageButton widget) for an menu item - action view could be simple or complex view type

But what if u don't want to change the view, but keep the default view? – SuperThomasLab

example (this is one way of many by using a layout tree observer / by setting a layout change listener):

    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);
            }
        }
  } 

I tried the OnLayoutChangeListener, but it still doesn't work Nothing changed. – SuperThomasLab

YES IT DOES - but i know the reason why it't is not working in your case ??? - in my example we check if view item is laid out instead of that change if menu view is laid out and then check if menu contain item

here is working code for you to study:

https://github.com/c3ph3us/LongClickOnMenuItem

in reply to other comments:

@ SuperThomasLab It's not obvious for me why setOnLongClickListener(...) method is not available for you. – Hossein Seifi

@HosseinSeifi - look at android.view.MenuItem interface - it doesn't provide a such method - so for good programmer this should be obvious :) why he can't reach implementing class method.

这篇关于如何在 MenuItem(在 NavigationView 上)上设置长按侦听器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆