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工作。