Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.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可以工作,但OnClickListener不能';T_Android_Android View_Onclicklistener_Ontouchlistener - Fatal编程技术网

Android OnTouch可以工作,但OnClickListener不能';T

Android OnTouch可以工作,但OnClickListener不能';T,android,android-view,onclicklistener,ontouchlistener,Android,Android View,Onclicklistener,Ontouchlistener,我创建了一个可以重用的小部件/控件,它是通过扩展RelativeLayout创建的。然后,在我的一项活动中,我在一个循环中创建了一组这些小部件。然而,当我想让每个小部件响应单击时,我遇到了一个问题 我发现设置OnTouchListener有效: this.setOnTouchListener(new OnTouchListener(){ public boolean onTouch(View arg0, MotionEvent arg1) { //Trig

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

我发现设置
OnTouchListener
有效:

 this.setOnTouchListener(new OnTouchListener(){
        public boolean onTouch(View arg0, MotionEvent arg1) {
           //Triggers debug message
        }       
    });
但是,
OnClickListener
不会:

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

    });

这是为什么?

这里有一些东西需要检查,以确保您的视图是可点击的:

View.setClickable()
View.setEnabled()
View.setFocusable()
View.setFocusableInTouchMode()

根据您希望获得的确切行为,您需要将其中一个或多个设置为on。由于您正在获取这些事件,我猜您需要设置Clickable。但是我必须查看视图创建代码才能确定。

您应该确保TouchListener没有“消费”触摸事件。如果您从<代码> OnTouChh()/代码>方法返回true,Android将考虑它被消耗,而不将它传递给其他各种触摸处理程序(我假设其中包含CLIKListEnter)。 你应该做:

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

是否正确返回布尔onTouch值

从文档中:

onTouch()-返回一个布尔值以指示 您的侦听器是否使用此 事件重要的是 此事件可以有多个操作 它们彼此紧随其后。所以,如果你 关闭操作时返回false 事件,则您指示 您尚未使用该事件,并且 也不感兴趣的后续 来自此事件的操作。因此,你 不需要任何其他的 事件中的操作,例如 手指的手势,或最终向上 行动事件

编辑

从中找到了解决方案,并亲自尝试


您需要使用这个
返回super.onTouchEvent(事件)在onTouchEvent代码中。添加此选项后,OnClickListener开始工作。

如果出于某种原因重写onMotionEvent()方法,并且在这种情况下需要返回true/false,则可以通过在重写的onMotionEvent()中调用this.performClick()来手动触发OnClickListener()回调在返回真/假之前。

要在
onTouch()中执行此返回假,请执行以下操作:

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

当您需要在同一视图上同时使用onClick和onTouch事件时,请使用。

您可以通过onTouchListener实现onClickListener:

webView.setOnTouchListener(new View.OnTouchListener() {

        public final static int FINGER_RELEASED = 0;
        public final static int FINGER_TOUCHED = 1;
        public final static int FINGER_DRAGGING = 2;
        public final static int FINGER_UNDEFINED = 3;

        private int fingerState = FINGER_RELEASED;


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

            switch (motionEvent.getAction()) {

                case MotionEvent.ACTION_DOWN:
                    if (fingerState == FINGER_RELEASED) fingerState = FINGER_TOUCHED;
                    else fingerState = FINGER_UNDEFINED;
                    break;

                case MotionEvent.ACTION_UP:
                    if(fingerState != FINGER_DRAGGING) {
                        fingerState = FINGER_RELEASED;

                        // Your onClick codes

                    }
                    else if (fingerState == FINGER_DRAGGING) fingerState = FINGER_RELEASED;
                    else fingerState = FINGER_UNDEFINED;
                    break;

                case MotionEvent.ACTION_MOVE:
                    if (fingerState == FINGER_TOUCHED || fingerState == FINGER_DRAGGING) fingerState = FINGER_DRAGGING;
                    else fingerState = FINGER_UNDEFINED;
                    break;

                default:
                    fingerState = FINGER_UNDEFINED;

            }

            return false;
        }
    });

如果您尝试返回false:

this.setOnTouchListener(new OnTouchListener(){
    public boolean onTouch(View arg0, MotionEvent arg1) {
        return false;
    }       
});
但它不起作用,如果使用ScrollView,请尝试此解决方案。 在滚动视图中添加线性布局。 在其中将clickable设置为true。 从LinearLayout调用setOnClickListener和setOnTouchListener

<ScrollView
android:id="@+id/scrollview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:scrollbarStyle="outsideOverlay">

<LinearLayout
    android:id="@+id/linearlayout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:focusable="true"
    android:gravity="center_vertical"
    android:orientation="vertical">

    <content... />

</LinearLayout>
</ScrollView>


LinearLayout linearlayout = findViewById(R.id.linearlayout);
linearlayout.setOnClickListener...
linearlayout.setOnTouchListener...

LinearLayout LinearLayout=findViewById(R.id.LinearLayout);
linearlayout.setOnClickListener。。。
linearlayout.setOnTouchListener。。。

您是否将这两个都添加到同一个对象?@nicholas.hauschild-不,一次一个-注释掉另一个。。您必须在onTouchListener中返回True,以防止事件被消耗。@harvey\u slash,实际返回True意味着它必须被消耗。所以,为了不消耗它,你必须返回false。我从ontouchlistener返回了false,但它不起作用。很有趣,很高兴知道。。。然而,当我测试onClick时,我会注释掉ontouch,感谢更新。但是,我不确定你到底是什么意思。在触控事件中,这将走向何方?我尝试在我的OnTouchListener中替换“return true”-“event”是一个“MotionEvent”,并且超级类不识别它。谢谢你的回复。我尝试将所有这些都设置为true,但没有成功。将我的扩展相对布局设置为“this.setClickable(true);”实际上就是答案。我使用了一个“Toast”消息作为调试语句,而不是logcat。结果发现我使用了错误的上下文对象。谢谢兄弟…但这会禁用你的ontouch侦听器。。。这与从你的应用程序中删除它是一样的。对我有用。从onTouch返回false使onClick工作。