Android的setOnLongClickListener与onTouch事件不兼容

3

我有一个可拖拽和缩放的图像视图,现在我还需要在我的图像视图上设置setOnLongClickListner。我已经做了这个,但它不起作用。但当我禁用ontouch事件时,它开始工作。请问有人能告诉我如何解决它呢?下面是我的代码:

    image.layout(0, 30, screenWidth, screenHeight - 30);
    image.setScaleType(ImageView.ScaleType.FIT_XY);


    params = new RelativeLayout.LayoutParams(screenWidth, screenHeight - 30);
    params.leftMargin = 0;
    params.topMargin = 30;


    layout.addView(image, params);

    image.setOnLongClickListener(new View.OnLongClickListener() {
        public boolean onLongClick(View v) {


            Log.i("its working", "its working");

            return true;
                    }
    });

    image.setOnTouchListener(this);

i,ll be very thankful.

thanks a lot.


1
展示一下你的代码:当你设置监听器时,需要在监听器内部编写相关ImageView代码。此外,我认为触摸事件会在长按事件之前发生。可能是因为触摸监听器消耗了onClickEvent事件,所以不会被触发。 - Maragues
4个回答

2

我认为对象可以有onClick或onTouch,它将使用最后一个定义的事件。我最近在我的一些应用程序中也注意到了这点。


2
根据开发者文档,从这些事件监听器中返回true将停止事件传播到其他事件监听器,并且还会阻止回调到View中的默认事件处理程序。因此,请确保在返回true时要终止事件。因此,在处理事件的方法中返回false可能会使您更接近想要实现的目标。

1
我尝试过使用“返回false”,但它会同时触发两个事件。在以下示例中,将显示不同的标题信息。
public boolean onTouch(View v, MotionEvent event) {   
        // TODO Auto-generated method stub 
          int ea=event.getAction();                                    

          switch(ea){                                                       
          case MotionEvent.ACTION_MOVE:                                 
           int l=v.getLeft();                                       
           int b=v.getBottom();                                     
           int r=v.getRight();                                      
           int t=v.getTop();   
           String message = "l:"+l + "t:" + t+
             "r:"+r + "b:"+ b;
           this.setTitle(message);                                     
          }  
          return false;
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
        this.setTitle("Click");
}

@Override
public boolean onLongClick(View arg0) {
    // TODO Auto-generated method stub
    this.setTitle("Long Click");
    return false;
}

1

经过搜索、尝试和错误,我已经成功地运行了它,并希望能与您一起使用。

1-在XML中的ImageView中添加android:clickable="true"

2-在您的Activity或View中确保return false;

imageView.setOnTouchListener(new OnTouchListener() {
        @TargetApi(11)
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub          
                Log.v(TAG, "Touched Here");
                return false;
        }
    });

3- 然后最后一步确保 return true;

imageView.setOnLongClickListener(new OnLongClickListener() {

        public boolean onLongClick(View v) {
            // TODO Auto-generated method stub
            Log.v(TAG, "Long Pressed Here");
            return true;
            }        
        });

在触摸和长按方面,它将运行良好


该onTouchListener将不会收到任何后续的UP事件。 - nilo de roock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接