android: как увеличить время нажатия для элементов списка в Android?

У меня есть custom listview, в котором элементы прокручиваются горизонтально. Я хочу выполнить одиночное касание и долгое нажатие для элементов в течение 5 секунд для listview элементов. Как это сделать. Как увеличить longpress интервал времени для listview элементов до 5 секунд.


person Manish Kumar    schedule 26.12.2016    source источник


Ответы (4)


Это более точно воспроизводит onLongPress, потому что не ждет, пока пользователь поднимет палец, перед выполнением. Был написан специально для ViewPager, но должен иметь возможность применять аналогичную логику.

// long press duration in milliseconds
public static final int LONG_PRESS_DURATION = 2000;

private boolean mIsTouching = false;

@Override
public boolean onTouchEvent(MotionEvent event) {

    if (event.getAction() == event.ACTION_DOWN) {
        mIsTouching = true;
    } else if (event.getAction() == event.ACTION_UP) {
        mIsTouching = false;
    }

    return super.onTouchEvent(event);
}

@Override
public void onLongPress(MotionEvent event) {

    // subtracts the system set timeout since that time has already occured at this point
    int duration = LONG_PRESS_DURATION - getLongPressTimeout();

    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            if (mIsTouching) {
                do something...
            }
        }
    }, duration > 0 ? duration : 0);
}
person Denver AK    schedule 04.07.2017
comment
Где onLongPress(MotionEvent) метод? Не могу найти в ViewPager. Вы имеете в виду onLongClick(View view) в View.OnLongClickListener? - person Tim Kist; 05.10.2017
comment
Спасибо. Сработало для меня, хотя мне пришлось удалить getLongPressTimeout () из вашего решения. - person TomV; 13.11.2017
comment
Это можно сделать проще, запустив postDelayed в onTouchEvent / ACTION_DOWN. Здесь нет необходимости вычитать getLongPressTimeout. Не нужен onLongPress. - person ToolmakerSteve; 06.10.2018

Вы можете setOnItemLongClickListener, затем вы можете установить вид, которым вы касаетесь OnTouchListener, вы можете записывать время, когда ACTION_DOWN, и время ACTION_UP, чтобы вы могли вычислить, если время между ACTION_DOWN и ACTION_UP больше 5 секунд.

person juemuren4449    schedule 26.12.2016
comment
ИМО, это было бы неестественным вариантом использования, потому что мы обычно ждем всплывающего окна или каких-либо изменений, прежде чем отпустить палец, пользователь обычно не считает 1.2.3.4.5, а затем отпускает. - person Enzokie; 26.12.2016
comment
Чтобы прояснить комментарий Энзоки: если вы ждете, пока ACTION_UP вычислит время, пользователь не сможет узнать, достаточно ли долго он удерживал его. Вместо этого действие должно запускаться с задержкой после ACTION_DOWN, если палец все еще касается. См. Ответ Денвера. - person ToolmakerSteve; 06.10.2018

Вы не можете изменить задержку. Он встроен в структуру Android. Я также столкнулся с той же проблемой несколько дней назад.

Вы можете использовать setOnTouchListener для этого вручную.

Пример :

private long then;
private int longClickDur= 5000; //5 seconds


//you can use any view you want
ImageView imageView = (ImageView) findViewById(R.id.longclick_view);
imageView.setOnTouchListener(new OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
          then = (long) System.currentTimeMillis();
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
          if ((System.currentTimeMillis() - then) > longClickDuration) {
            /* Long click behaviour will go here*/
            Toast.makeText(context, "yay, long click", Toast.LENGTH.SHORT);
            return false;
          } else {
            /* LONG CLICK FAILED*/
            Toast.makeText(context, "TRY AGAIN", Toast.LENGTH.SHORT);
            return false;
          }
        }
        return true;
      }
    });
person Amit Bhandari    schedule 26.12.2016
comment
Я сделал то же самое, но в этом случае горизонтальная прокрутка списка не происходит .... - person Manish Kumar; 26.12.2016
comment
Это та же проблема, которую Энзоки упомянул в ответе juemuren: это не дает ПОЛЬЗОВАТЕЛЮ никакой обратной связи относительно того, когда они удерживали касание достаточно долго. См. Ответ Денвера для лучшего подхода. - person ToolmakerSteve; 06.10.2018
comment
это долгий щелчок, а не долгое нажатие - person tosh17; 14.01.2020

Вот моя реализация: (Вам не нужно отпускать, чтобы снять действие)

Handler longTouchHandler= new Handler();
static final int longduration=10000;//10000ms press duration
@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == event.ACTION_DOWN) {
        longTouchHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Log.w("Longpress","longpressed");
            }
        }, longduration);
        return true;
    }
    else if (event.getAction() == event.ACTION_UP) {
        longTouchHandler.removeCallbacksAndMessages(null);
        Log.w("Longpress","cancelled");
    }

    return super.onTouchEvent(event);
}
person Levente Gulyás    schedule 19.05.2021