OnTouch可以工作,但是OnClickListener没有?

tpo*_*pow 20 android ontouchlistener android-view onclicklistener

我创建了一个小部件/控件,我可以重用我通过扩展创建的RelativeLayout.然后,在我的一个活动中,我在循环中创建了一堆这些小部件.但是,当我想让每个小部件响应一次点击时,我遇到了一个问题.

我发现设置OnTouchListener有效:

 this.setOnTouchListener(new OnTouchListener(){
        public boolean onTouch(View arg0, MotionEvent arg1) {
           //Triggers debug message
        }       
    });
Run Code Online (Sandbox Code Playgroud)

OnClickListener不是:

  this.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v) {
           //Doesn't trigger debug message  
        }

    });
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

nic*_*ild 49

您应该确保TouchListener没有"消耗"触摸事件.如果你从onTouch()方法中返回true ,Android会认为它被消耗了,而不是传递给其他各种触摸处理程序(我假设它将包含ClickListener).

你应该做:

this.setOnTouchListener(new OnTouchListener(){
    public boolean onTouch(View arg0, MotionEvent arg1) {
        //Triggers debug message
        return false;
    }       
});
Run Code Online (Sandbox Code Playgroud)


Nic*_*ion 16

以下是一些要检查的内容,以确保您的观看次数可以点击:

View.setClickable()
View.setEnabled()
View.setFocusable()
View.setFocusableInTouchMode()
Run Code Online (Sandbox Code Playgroud)

根据您希望获得的确切行为,您需要将其中一个或多个设置为开启.由于你正在进行onTouch事件,我猜你需要setClickable.但我必须确保视图创建代码.

  • 谢谢回复.我尝试将所有这些设置为true,但它不起作用. (3认同)

Abh*_*nav 15

您是否正确返回布尔值onTouch值?

来自文档:

onTouch() - 返回一个布尔值,指示您的侦听器是否使用此事件.重要的是这个事件可以有多个相互跟随的动作.因此,如果在收到向下操作事件时返回false,则表示您尚未使用该事件,并且对此事件的后续操作也不感兴趣.因此,您不会在事件中调用任何其他操作,例如手指手势或最终的上行动作事件.

编辑

在这个问题中找到了解决方案并且我自己试了一下.

您需要return super.onTouchEvent(event);在onTouchEvent代码中使用它.添加此项后,OnClickListener开始工作.


小智 5

要执行此操作,请在此处返回false onTouch():

this.setOnTouchListener(new OnTouchListener(){    
        public boolean onTouch(View arg0, MotionEvent arg1) {   
            return false;
        }       
});
Run Code Online (Sandbox Code Playgroud)

  • 但这会禁用您的 ontouch 侦听器...这与将其从您的应用程序中删除相同。 (2认同)