Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

onTouchEvent onClick onLongClick calls

In our application, we handle the events in a 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 doesn't work.

Can anyone tell me why this happens and if possible explain me with an example.

The code I use:

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;
}
like image 521
AndroidDev Avatar asked Sep 07 '11 12:09

AndroidDev


3 Answers

According to the doc Handling UI Events,

onLongClick() - This returns a boolean to indicate whether you have consumed the event and it should not be carried further. That is, return true to indicate that you have handled the event and it should stop here; return false if you have not handled it and/or the event should continue to any other on-click listeners.

And above all about onTouch:

onTouch() - This returns a boolean to indicate whether your listener consumes this event. The important thing is that this event can have multiple actions that follow each other. So, if you return false when the down action event is received, you indicate that you have not consumed the event and are also not interested in subsequent actions from this event. Thus, you will not be called for any other actions within the event, such as a finger gesture, or the eventual up action event.

Indeed, depending on the event, you have to return the right value.

like image 97
xevincent Avatar answered Nov 13 '22 05:11

xevincent


You have to return false instead of true in OnTouch(View v,MotionEvent event) function so that other listeners on the control remains active.

like image 43
Hemant Mendi Ratta Avatar answered Nov 13 '22 05:11

Hemant Mendi Ratta


Seems like you have reference problem. Try to set click, long click and touch listener like this:

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;
    }
});
like image 2
Vineet Shukla Avatar answered Nov 13 '22 04:11

Vineet Shukla