Android setOnLongClickListener()

作者: 楊帥 | 来源:发表于2017-05-17 21:35 被阅读1978次

在做项目的时候,经常会有如下图这样的需求,每个按钮都有点击事件,同时还会有删除的状态存在,这时候,onClickListener点击事件就不能完全实现需求,这时候大家都知道用onLongClickListener来解决,但是用过很多次,经常碰到坑,一直都没有总结,这里做下简单笔记。

Paste_Image.png

首先来分析下setOnLongClickListener()这个方法中的参数:

view.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View view) {
                    return false;
                }
            });

这里的view就是长按的view毋容置疑,那么返回值false到底是什么意思呢?


111.png

官方文档里面的解释为:如果让回调消耗该长按,返回true,否则false 意思就是返回true这个长按就结束了,如果false,会有其他地方继续响应该长按,解释并不是很明确,回调消耗,具体是怎么个回调消耗方式?我个人对其并不是完全理解,我相信不止我一个人对这个问题有所疑问。 下面做一个测试:

  1. 我们return true,然后测试下功能
final ViewHolder finalV = v;
            finalV.deleteGvCarupphoto.setVisibility(View.GONE);
            v.layoutGvCarupphoto.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View view) {
                    finalV.deleteGvCarupphoto.setVisibility(View.VISIBLE);
                    return true;
                }
            });
            v.layoutGvCarupphoto.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Toast.makeText(context,"走了点击事件",Toast.LENGTH_SHORT).show();
                }
            });

由于本人测试这个项目是在自己项目中直接测试的,可能代码有点繁琐,希望大家不要介意 该代码功能:我们先把删除按钮隐藏,然后在长按监听中显示并return true,再对同一个控件进行点击事件Toast,看一下效果

onlongclick02.jpg

可以看到,删除按钮展示出来了,Toast并没有执行

  1. 我们return false,然后进行同样的测试
 final ViewHolder finalV = v;
            finalV.deleteGvCarupphoto.setVisibility(View.GONE);
            v.layoutGvCarupphoto.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View view) {
                    finalV.deleteGvCarupphoto.setVisibility(View.VISIBLE);
                    return false;
                }
            });
            v.layoutGvCarupphoto.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Toast.makeText(context,"走了点击事件",Toast.LENGTH_SHORT).show();
                }
            });

执行一下,看看结果

44444.jpg

由此可见:返回true,那么长按监听只执行长按监听中执行的代码,返回false,还会继续响应其他监听中的事件。

PS:网上也有一种说法,说返回false,就再执行一次短的点击事件,从测试结果上来说,虽然效果是这样的,但这种说法我并不认同,从原理上就不一样,官方文档明确说的是false是把长按传递出去,而并非再次执行一次点击事件,只是巧合的是目前长按之后只有onclick一种点击可测试,如再有一种类似的事件来测试,该说法也不攻自破了

二维码.jpg

推荐下本人的微信公众号,本博客及其他方面的消息会定期同步到公众号上面!

相关文章

网友评论

    本文标题:Android setOnLongClickListener()

    本文链接:https://www.haomeiwen.com/subject/rkljxxtx.html