Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android中禁用父对象的onTouch保留子对象的onTouch_Android_Android Layout_Ontouchlistener - Fatal编程技术网

如何在android中禁用父对象的onTouch保留子对象的onTouch

如何在android中禁用父对象的onTouch保留子对象的onTouch,android,android-layout,ontouchlistener,Android,Android Layout,Ontouchlistener,我正在吃什么: 我在线性布局上有一个imageview。我想检测 imageview的onTouch 我不想使用onClick,因为我的实现需要 onTouchImageview是linearLayout的子级 发生了什么: @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); imgUsrClrId.

我正在吃什么:

  • 我在线性布局上有一个
    imageview
    。我想检测
    imageview的
    onTouch
  • 我不想使用
    onClick
    ,因为我的实现需要 onTouch
    Imageview
    是linearLayout的子级

发生了什么:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    imgUsrClrId.setOnTouchListener(imgSourceOnTouchListener);
}


 OnTouchListener imgSourceOnTouchListener= new OnTouchListener(){

    @Override
    public boolean onTouch(View view, MotionEvent event) {

        Log.d("", "");

        return true;
    }};
  • 当我从图像和中单击图像一时,会触发两个触摸事件 另一个来自
    线性布局(父级)

问题:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    imgUsrClrId.setOnTouchListener(imgSourceOnTouchListener);
}


 OnTouchListener imgSourceOnTouchListener= new OnTouchListener(){

    @Override
    public boolean onTouch(View view, MotionEvent event) {

        Log.d("", "");

        return true;
    }};
  • 如何禁用保留
    Imageview的
    onTouch

代码:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    imgUsrClrId.setOnTouchListener(imgSourceOnTouchListener);
}


 OnTouchListener imgSourceOnTouchListener= new OnTouchListener(){

    @Override
    public boolean onTouch(View view, MotionEvent event) {

        Log.d("", "");

        return true;
    }};

没有从不同视图生成多个触摸事件,所有触摸事件都来自相同的ImageView,我做了如下测试

有一个跟踪它所来自的viewID

 ImageView imageView = (ImageView) findViewById(R.id.imageView);
 Log.i("Tag","ImageView ID :"+imageView.getId());
 imageView.setOnTouchListener(new View.OnTouchListener()
 {
        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            Log.i("Tag","OnTouch View ID :"+v.getId());
            return true;
        }
 });
当您从onTouch返回true时,事件将被消耗

这是输出

ImageView ID :2131230721

OnTouch View ID :2131230721
OnTouch View ID :2131230721
OnTouch View ID :2131230721

触摸事件一次只为一个视图触发,在代码中,触摸事件是为imageview触发的,但正如我们所知,每个运动事件都会调用touchListener。ACTION\u DOWNMotionEvent.ACTION\u UPMotionEvent.ACTION\u MOVE。因此,如果您希望一次只触发一个事件,即MotionEvent.ACTION\u DOWNMotionEvent.ACTION\u UP,请按以下方式编写:

 @Override
 public boolean onTouchEvent(MotionEvent ev) {

        final int action = ev.getAction();

        switch (action) {

            // MotionEvent class constant signifying a finger-down event

            case MotionEvent.ACTION_DOWN: {
                 //your code

                break;
            }

            // MotionEvent class constant signifying a finger-drag event  

            case MotionEvent.ACTION_MOVE: {

                   //your code

                  break;

            }

            // MotionEvent class constant signifying a finger-up event

            case MotionEvent.ACTION_UP:
              //your code

                break;

        }
        return true;
    }

看看这个。。这可能有助于@Praveen。。。我需要
OnTouchListener()
,所以我无法使用该解决方案!如何将单击事件从生成两次减少为单个事件!你能告诉我这样做的目的吗?因为触摸事件真的是为了提供我们触摸数据,而不是一次。这是一个有点难看的解决方案,但你可以在每张图像上保留一个状态布尔值来指示它是否被触摸过,并且只在它还没有做事情时才行动,然后在完成后再次释放它。这应该是有效的,因为触摸事件发生的间隔为毫秒,忽略了第二个事件。@user3427079。。。这是一个解决方案&是的,它工作了……但是为什么onTouch事件会触发两次呢?有什么想法吗?不知道,你确定没有在项目上设置多个onclick吗?比如在XML和代码中,或者在代码的多个地方?