Почему функция performLongClick() не вызывается, когда я долго нажимаю на телефон

#android

Вопрос:

Я пытаюсь создать представление клиента, которое поддерживает перетаскивание. Я хочу отключить перетаскивание после срабатывания длительного щелчка, поэтому я переопределяю performLongClick() для записи длительного щелчка.

     @Override
    public boolean performLongClick(float x, float y) {
        boolean ret = super.performLongClick(x, y);
        mHasPerformedLongPress = true;
        return ret;
    }
 

Но я обнаружил, что эта функция не вызывалась, когда я долго нажимал на телефон, даже OnLongClickListener ответил.

Ответ №1:

Я думаю, ты неправильно понял, что должно было произойти. Согласно ссылке doc :, функция performLongClick вызывает OnLongClickListener представления, даже если никакого реального длительного щелчка не произошло.

Эта функция не вызывается, когда пользователь выполняет длинный щелчок.

Вместо этого OnLongClickListener представления вызывается, когда пользователь долго нажимает на него. Что вы хотите сделать, это переопределить OnLongClickListener и поместить туда свою логику :

 View myView = findViewById(R.id.myView);
myView.setOnLongClickListener(new View.OnLongClickListener() {
  @Override
  public boolean onLongClick(View v) {
    boolean ret = super.onLongClick(v);
    mHasPerformedLongPress = true;
    return ret;
  }
});
 

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

1. Исходные коды представления в API 31 показывают, что функция performLongClick() будет вызываться, когда представление обрабатывает длительное нажатие. Это меня смущает. Я снова протестировал его на платформе API 31, и он работает. Возможно, у старой платформы другое поведение в отношении этой функции.