Android: длительное нажатие кнопки → выполнение действий

Я хочу использовать ту же кнопку для выполнения двух разных методов. Один из методов, когда пользователь нажимает один клик и второй метод (другой), когда пользователь LONG нажимает на него.

Я использую это для одного короткого щелчка (который отлично работает):

Button downSelected = (Button) findViewById(R.id.downSelected);
        downSelected.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                method();
                }
            }

        });

Я попытался добавить longClickListener, но это не сработало.

Оцените любые идеи о том, как решить эту проблему.

Спасибо!

Ответ 1

Я делал это раньше, я просто использовал:

down.setOnLongClickListener(new OnLongClickListener() { 
        @Override
        public boolean onLongClick(View v) {
            // TODO Auto-generated method stub
            return true;
        }
    });

В документации:

public void setOnLongClickListener (View.OnLongClickListener l)

С: API Уровень 1 Зарегистрировать обратный вызов для вызова, когда это представление нажмите и удерживайте. Если это мнение не длинный кликабель, он становится длинным кликабельны.

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

Ответ 2

Чтобы обе функции работали над кликабельным изображением, которое будет реагировать как на короткие, так и на длинные клики, я попробовал следующее, что, кажется, отлично работает:

    image = (ImageView) findViewById(R.id.imageViewCompass);
    image.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            shortclick();
        }
     });

    image.setOnLongClickListener(new View.OnLongClickListener() {
    public boolean onLongClick(View v) {
        longclick();
        return true;
    }
});

//Затем функции, которые вызывают:

 public void shortclick()
{
 Toast.makeText(this, "Why did you do that? That hurts!!!", Toast.LENGTH_LONG).show();

}

 public void longclick()
{
 Toast.makeText(this, "Why did you do that? That REALLY hurts!!!", Toast.LENGTH_LONG).show();

}

Кажется, что простой способ объявить элемент в XML как интерактивный, а затем определить функцию для вызова по клику, применим только к короткому клику - у вас должен быть слушатель, чтобы различать короткие и длинные клики.

Ответ 3

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

Ответ 4

Другой метод:

private void donwloadImageLongClick(ImageView imageView) {

    imageView.setOnTouchListener(new View.OnTouchListener() {

        long then = System.currentTimeMillis();

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            if(event.getAction() == MotionEvent.ACTION_DOWN){

                long then = System.currentTimeMillis();

            }

            if (event.getAction() == MotionEvent.ACTION_UP) {
                if ((System.currentTimeMillis() - then) > 3000) {
                    Toast.makeText(mContext, "Button touch", Toast.LENGTH_SHORT).show();
                    return true;
                }
            }

            return false;
        }
    });

}