在我们的应用程序中,我们处理按钮中的事件以记录数据。
所以,最初当我将setOnLongClickListener()
和setOnClickListener()
与同一个按钮一起使用时,它对我们来说很好。
这意味着它将基于Click和LongClick按钮调用此侦听器。现在,当我尝试将setOnTouchListener()
与setOnLongClickListener()
和setOnClickListener()
一起使用相同的按钮时,只有OnTouch事件正在运行,休息onclick和onLongclick事件无效。
任何人都可以告诉我为什么会发生这种情况,如果可能的话,请举例说明。
我使用的代码是..
Button btnAdd=new Button(this)
btnAdd.setOnLongClickListener(this);
btnAdd.setOnClickListener(this);
btnAdd.setOnTouchClickListener(this);
public void onClick(View v)
{
//Statements;
}
public void onLongClick(View v)
{
//Statements;
}
public boolean onTouch(View v, MotionEvent e)
{
switch (e.getAction())
{
case MotionEvent.ACTION_DOWN:
{
//store the X value when the user's finger was pressed down
m_downXValue = e.getX();
break;
}
case MotionEvent.ACTION_UP:
{
//Get the X value when the user released his/her finger
float currentX = e.getX();
//MotionEvent x=MotionEvent.obtain((long) m_downXValue, SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, 1, 1, 1, 1,0, 0, 0, 0, 0);
// going forwards: pushing stuff to the left
if (m_downXValue > currentX && currentX < 0)
{
ViewFlipper vf = (ViewFlipper) findViewById(R.id.flipview);
vf.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.slide_left));
vf.showNext();
}
// going backwards: pushing stuff to the right
if (m_downXValue < currentX && currentX > 100)
{
ViewFlipper vf = (ViewFlipper) findViewById(R.id.flipview);
vf.setAnimation(AnimationUtils.loadAnimation(this, R.anim.slide_right));
vf.showPrevious();
}
if (m_downXValue == currentX)
{
onClick(v);
}
break;
}
}
return true;
}
答案 0 :(得分:22)
根据文件Handling UI Events,
onLongClick() - 返回一个布尔值,表示您是否已经消耗了该事件,并且不应该进一步携带它。也就是说,返回true表示你已经处理了这个事件,它应该在这里停止;如果您没有处理它和/或该事件应该继续任何其他点击监听器,则返回false。
最重要的是onTouch:
onTouch() - 返回一个布尔值,指示您的侦听器是否使用此事件。 重要的是,此事件可以有多个相互跟随的操作。因此,如果在收到向下操作事件时返回false,则表示您尚未使用该事件,并且对此事件的后续操作也不感兴趣。因此,您不会在事件中调用任何其他操作,例如手指手势或最终的上行动作事件。
实际上,根据事件的不同,您必须返回正确的值。
答案 1 :(得分:4)
您必须在OnTouch(View v,MotionEvent事件)函数中返回false而不是true,以便控件上的其他侦听器保持活动状态。
答案 2 :(得分:2)
好像你有参考问题。尝试设置单击,长按和触摸侦听器,如下所示:
btnAdd.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
btnAdd.setOnLongClickListener(new Button.OnLongClickListener(){
@Override
public boolean onLongClick(View v) {
// TODO Auto-generated method stub
return false;
}
});
btnAdd.setOnTouchListener(new Button.OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
return false;
}
});
答案 3 :(得分:1)
如果您需要在同一视图上同时点击和触摸事件,请使用GestureDetector。它也可以检测长按。
答案 4 :(得分:0)
我不确定这是你想要实现的目标,因为你为按钮设置onTouchListener - 但是 如果你想要实现的是可滑动的活动(例如,滑动屏幕和屏幕内容更改)您可以尝试让您的活动扩展下面发布的类,然后使用您想要的任何操作实施next()
和previous()
方法。 / p>
import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.GestureDetector.SimpleOnGestureListener;
public abstract class SwipeActivity extends Activity {
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
private GestureDetector gestureDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gestureDetector = new GestureDetector( new SwipeDetector() );
}
private class SwipeDetector extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
// Check movement along the Y-axis. If it exceeds SWIPE_MAX_OFF_PATH, then dismiss the swipe.
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false;
// Swipe from right to left.
// The swipe needs to exceed a certain distance (SWIPE_MIN_DISTANCE) and a certain velocity (SWIPE_THRESHOLD_VELOCITY).
if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
next();
return true;
}
// Swipe from left to right.
// The swipe needs to exceed a certain distance (SWIPE_MIN_DISTANCE) and a certain velocity (SWIPE_THRESHOLD_VELOCITY).
if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
previous();
return true;
}
return false;
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
//TouchEvent dispatcher.
if (gestureDetector != null) {
if (gestureDetector.onTouchEvent(ev))
//If the gestureDetector handles the event, a swipe has been executed and no more needs to be done.
return true;
}
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
protected abstract void previous();
protected abstract void next();
}
答案 5 :(得分:0)
以下是我使用ontouch和onlongclick解决同步的方法
希望每个人看到这段代码后都能弄明白。 发生的事情是每当长按发生时,touchlistener被设置为无监听器,当再次触摸视图时,无监听器将视图的touchlistener设置为其先前的监听器
LinearLayout.LayoutParams longpressLP = new LinearLayout.LayoutParams(100,100);
LinearLayout longpress = new LinearLayout(this);
longpress.setBackgroundColor(Color.GREEN);
//any layout you want to add your view in
mainlayout.addView(longpress,longpressLP);
final View.OnTouchListener buttontouch=new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_DOWN)
Toast.makeText(getApplicationContext(), "Touched Down", Toast.LENGTH_SHORT).show();
else
Toast.makeText(getApplicationContext(), "Touched", Toast.LENGTH_SHORT).show();
return false;//IMPORTANT
}
};
final View.OnTouchListener buttontouchnone=new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_DOWN)//IMPORTANT
{
v.setOnTouchListener(buttontouch);//IMPORTANT
v.dispatchTouchEvent(event);//IMPORTANT
Toast.makeText(getApplicationContext(), "ChangedListener", Toast.LENGTH_SHORT).show();
}
return false;//IMPORTANT
}
};
//set listeners
longpress.setOnTouchListener(buttontouch);
longpress.setOnLongClickListener(new View.OnLongClickListener() {
public boolean onLongClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "LongClick", Toast.LENGTH_SHORT).show();
v.setOnTouchListener(buttontouchnone);//IMPORTANT
return true;//IMPORTANT
}
});