Реализовать GestureDetector.OnDoubleTapListener правильно в пользовательском представлении

#android

#Android

Вопрос:

У меня есть CustomAutoCompleteTextView , и я хочу иметь возможность вызывать showDropDown(); , когда пользователь double-tap на нем.

Как следует из названия, implements GestureDetector.OnDoubleTapListener звучит как хорошее решение, но после добавления обязательных методов в мой пользовательский вид я понятия не имею, как все это настроить

Это методы для реализации:

  @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        return false;
    }

    @Override
    public boolean onDoubleTap(MotionEvent e) {
        return false;
    }

    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
        return false;
    }
  

Я хочу заархивировать что-то вроде этого:

 @Override
        public boolean onDoubleTapEvent(MotionEvent e) {
            showDropDown();//AutoCompleteTextView's this line is enough but the event is never triggered
            return super.doYourThing();
        }
  

Ответ №1:

Я нашел лучший способ, чем implements GestureDetector.OnDoubleTapListener архивировать это, обратите внимание, что это решение предназначено для реализации двойного нажатия внутри пользовательского представления и всех его экземпляров

 boolean firstTouch = false;
    long time;
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if(event.getAction() == event.ACTION_DOWN){
            if(firstTouch amp;amp; (System.currentTimeMillis() - time) <= 300) {
                firstTouch = false;
                showDropDown();//In my case I want to showDropDown() change this line for whatever you want to do
            } else {
                firstTouch = true;
                time = System.currentTimeMillis();
                return super.onTouchEvent(event);
                //return false;Use this if you dont want to call default onTouchEvent()
            }
        }
        return super.onTouchEvent(event);
         //return false;Use this if you dont want to call default onTouchEvent()
    }
  

Ответ №2:

1) создайте новый GestureDetector()

 detector = new GestureDetector(this,new OnGestureListener() {

@Override
public boolean onDoubleTap(MotionEvent e) {
    showDropDown()
    return true;
}
  

2) Добавьте свой CustomAutoCompleteTextView OnTouchListener

 txt.setOnTouchListener(new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        detector.onTouchEvent(event);
        return false;
    }
});
  

Комментарии:

1. Как это все еще не срабатывает

2. Я думаю, да, но я могу только догадываться, поскольку вы не делитесь обрезанным кодом, который показывает, где и как вы добавляете / создаете свой TextView

3. Я уверен, что это сработает, но у меня есть проблема, извините, что не указал, у меня есть несколько пользовательских AutoCompleteTextView, и я хочу, чтобы все они делали то же самое, так что этот способ потребует много работы. Я хочу реализовать функцию двойного нажатия в пользовательском классе, которая расширяет AutoCompleteTextView. И я только что нашел способ! Совместное использование за минуту. Спасибо за ваше время, приятель!

Ответ №3:

Это то, что хорошо сработало для меня:

tapDetector = новый GestureDetector(контекст, новый GestureDetector.SimpleOnGestureListener());

 tapDetector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e){
              //Notified when a single-tap occurs.
              Log.w("Debug","Single tap event occurred in view with ID: "  getId());
              return true;
            }
    
            @Override
            public boolean onDoubleTap(MotionEvent e) {
              Log.w("Debug","Double tap event occurred in view with ID: "  getId());
              return true;
            }
    
            @Override
            public boolean onDoubleTapEvent(MotionEvent e)  {
              //Notified when an event within a double-tap gesture occurs, including the down, move, and up events.
              return true;
            }
          });
  

Как упоминалось в предыдущем решении:

 txt.setOnTouchListener(new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        tapDetector.onTouchEvent(event);
        return false;
    }
});