21 Stimmen

Das LongClick-Ereignis tritt zu schnell auf. Wie kann ich die erforderliche Klickzeit erhöhen, um es auszulösen?

In einer Anwendung, an der ich arbeite, habe ich die Anforderung, dass ein Benutzer eine Komponente für eine bestimmte Zeit gedrückt halten muss, bevor eine bestimmte Aktion ausgelöst wird.

Derzeit verwende ich einen OnLongClickListener, um auf den Langklick zu hören, aber ich finde, dass die Dauer eines Klicks, um das OnLongClick-Ereignis auszulösen, zu kurz ist.

Zum Beispiel, sagen wir, das LongClick-Ereignis wird nach einem 400ms Klick ausgelöst, ich möchte aber, dass der Benutzer für 1200ms klicken und halten muss, bevor das Ereignis ausgelöst wird.

Gibt es eine Möglichkeit, das LongClick-Ereignis so zu konfigurieren, dass ein längerer Klick erforderlich ist?
Oder gibt es vielleicht eine andere Konstruktion, die es mir ermöglichen würde, auf längere Klicks zu hören?

2voto

Run Punkte 1948

Eine Methode kann es tun. Es ist einfach zu verwenden, einfach die Länge der Zeit zu konfigurieren, pünktlich um den Rückruf auszulösen.

public static void setOnLongClickListener(final View view, final View.OnLongClickListener longClickListener, final long delayMillis)
{
    view.setOnTouchListener(new View.OnTouchListener()
    {
        final Handler handler = new Handler();
        final Runnable runnable = new Runnable()
        {
            @Override
            public void run()
            {
                longClickListener.onLongClick(view);
                mRunning = false;
            }
        };

        boolean mRunning;
        boolean mOutside;
        RectF mRect = new RectF();

        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            switch (event.getAction())
            {
                case MotionEvent.ACTION_DOWN:
                {
                    handler.postDelayed(runnable, delayMillis);
                    mRunning = true;
                    mOutside = false;
                    mRect.set(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
                    break;
                }
                case MotionEvent.ACTION_MOVE:
                    if (!mOutside)
                    {
                        mOutside = !mRect.contains(v.getLeft() + event.getX(), v.getTop() + event.getY());
                        if (mOutside)
                        {
                            handler.removeCallbacks(runnable);
                            mRunning = false;
                        }
                    }
                    break;
                case MotionEvent.ACTION_UP:
                {
                    if (mRunning)
                        v.performClick();
                    handler.removeCallbacks(runnable);
                    mRunning = false;
                    break;
                }
                case MotionEvent.ACTION_CANCEL:
                {
                    handler.removeCallbacks(runnable);
                    mRunning = false;
                    break;
                }
            }
            return true; // !!!
        }
    });
}

1voto

Somsak Elect Punkte 31

Ich habe diese Methode gefunden. Es ist so einfach.

private static final long HOLD_PRESS_TIME = 1200; //ms Einheit    

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_control);

    //Deklariere deinen Button und füge den Listener hinzu
    ImageView iconImg = findViewById(R.id.more_icon);
    iconImg.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            switch (motionEvent.getAction()){
                case MotionEvent.ACTION_DOWN:
                    Log.w("Button", "Button wird gedrückt...");
                    //Starte den Timer
                    timer.start();
                    break;
                case MotionEvent.ACTION_UP:
                    Log.w("Button", "Button wird losgelassen...");
                    //Stoppe den Timer
                    timer.cancel();
                    break;
            }
            return false;
        }
    });

}

private CountDownTimer timer = new CountDownTimer(HOLD_PRESS_TIME, 200) {
    @Override
    public void onTick(long l) {
        Log.w("Button", "Count down..."+l); //Es ruft onFinish() auf, wenn l = 0
    }

    @Override
    public void onFinish() {
        //TODO deine Aktion hier!
        Log.w("Button", "Count finish...");

    }
};

0voto

Nabin Bhandari Punkte 15154

Als Referenz für die Zukunft, hier ist meine Implementierung :)

public abstract class MyLongClickListener implements View.OnTouchListener {

    private int delay;
    private boolean down;
    private Runnable callback;
    private RectF mRect = new RectF();

    public MyLongClickListener(int delay) {
        this.delay = delay;
        this.callback = new Runnable() {
            @Override
            public void run() {
                down = false;
                onLongClick();
            }
        };
    }

    public abstract void onLongClick();

    @Override
    public boolean onTouch(View v, MotionEvent e) {
        if (e.getPointerCount() > 1) return true;

        int action = e.getAction();
        if (action == MotionEvent.ACTION_DOWN) {
            down = true;
            mRect.set(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
            v.postDelayed(callback, delay);
            return false;

        } else if (action == MotionEvent.ACTION_MOVE) {
            if (down && !mRect.contains(v.getLeft() + e.getX(), v.getTop() + e.getY())) {
                v.removeCallbacks(callback);
                down = false;
                return false;
            }

        } else if (action == MotionEvent.ACTION_UP) {
            if (down) {
                v.removeCallbacks(callback);
                v.performClick();
            }
            return true;

        } else if (action == MotionEvent.ACTION_CANCEL) {
            v.removeCallbacks(callback);
            down = false;
        }

        return false;
    }

}

Verwendung:

textView.setOnTouchListener(new MyLongClickListener(2000) {
    @Override
    public void onLongClick() {
        System.err.println("onLongClick");
    }
});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X