In our application we handle the events in button to record data.
So initially when i use setOnLongClickListener()
and setOnClickListener()
together with the same button, it work fine for us.
That means it will call both this listener base on the click and LongClick of the button. Now when i tried to use setOnTouchListener()
with the same button together with setOnLongClickListener()
and setOnClickListener()
then only OnTouch event is working, rest onclick and onLongclick event doesnt work.
Can anyone tell me why this happen and if possible explain me with an example.
The code i use is..
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;
}
You have to return false instead of true in OnTouch(View v,MotionEvent event) function so that other listeners on the control remains active.
Here is how i solved a synchronisation with ontouch and onlongclick
Hope every body can figure out after looking at this code. What happens is whenever a long press happens the touchlistener is set for a none listener and when the view is touched again the none listener sets the touchlistener of the view to its previous listener
When you need both click and touch events on the same view, use a GestureDetector. It can detect long presses as well.
Seems like you have reference problem. Try to set click, long click and touch listener like this:
According to the doc Handling UI Events,
And above all about onTouch:
Indeed, depending on the event, you have to return the right value.
I'm not sure this is what you're trying to achieve, as you set the onTouchListener for the button - but if what you want to achieve is a swipeable activity (e.g swipe the screen and the content of the screen changes) you could try letting your activity extend the class posted below and then implement the
next()
andprevious()
methods with what ever actions you want.