OnTouchEvent onClick onLongClick вызывает

В нашем приложении мы обрабатываем события в кнопке для записи данных.

Поэтому, когда я использую setOnLongClickListener() и setOnClickListener() вместе с одной и той же кнопкой, он отлично работает для нас.

Это означает, что он вызовет и эту базу слушателя на клик и кнопку 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 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;
}

Ответ 1

В соответствии с документом Обработка событий пользовательского интерфейса,

onLongClick() - возвращает логическое значение, указывающее, использовало ли вы событие, и его нельзя переносить дальше. То есть верните true, чтобы указать, что вы обработали событие, и он должен остановиться здесь; return false, если вы его не обработали, и/или событие должно продолжаться до любого другого прослушивателя.

И прежде всего о onTouch:

onTouch() - возвращает логическое значение, указывающее, использует ли ваш слушатель это событие. Важно то, что это событие может иметь несколько действий, которые следуют друг за другом. Таким образом, если вы вернете false при поступлении события нисходящего действия, вы укажете, что вы не воспользовались событием и также не заинтересованы в последующих действиях этого события. Таким образом, вас не будут вызывать для каких-либо других действий в событии, таких как жест finger или возможное событие up action.

В самом деле, в зависимости от события, вы должны вернуть правильное значение.

Ответ 2

В функции OnTouch (View v, MotionEvent) вы должны вернуть false вместо истины, чтобы другие слушатели на элементе управления оставались активными.

Ответ 3

Похоже, у вас есть проблема с ссылкой. Попробуйте установить клик, длинный щелчок и прикоснуться к слушателю следующим образом:

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;
    }
});

Ответ 4

Если вам нужны оба события click и touch на одном и том же экране, используйте GestureDetector. Он также может обнаруживать длинные нажатия.

Ответ 5

Я не уверен, что это то, чего вы пытаетесь достичь, поскольку вы устанавливаете onTouchListener для кнопки - , но, если то, что вы хотите достичь, - это прокручиваемое действие (например, проведите по экрану экрана и содержимое экрана меняется), вы можете попробовать, чтобы ваша деятельность расширила класс, опубликованный ниже, а затем реализовала методы next() и previous() с тем, что вам нужно.

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();
}

Ответ 6

Вот как я решил синхронизацию с ontouch и onlongclick

Надеюсь, что каждый организм может понять, посмотрев на этот код. Что происходит, когда происходит длинное нажатие, сенсорный исполнитель устанавливается для ни одного слушателя, и когда снова коснется вид, ни один прослушиватель не устанавливает сенсорный исполнитель представления его предыдущему слушателю

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
        }
    });