Android :: OnTouchListener && OnClickListener проблема с комбинацией - PullRequest
5 голосов
/ 25 августа 2011

Описание проблемы:

У меня есть TextView на RelativeLayout, и я хочу покрасить его в красный цвет, когда пользователь касается его, и перейти на другую страницу, когда он щелкнет по нему.Поэтому я попытался установить OnClickListener для выполнения щелчка и OnTouchListener для реализации функции касания (MotionEvent.ACTION_DOWN), но эта комбинация не работает, потому что OnTouchListener делает OnClickListener неработоспособным (донНе знаю, почему).

На форумах люди говорят, что мы можем реализовать OnClick с помощью OnTouch MotionEvent.ACTION_UP, но этот может быть вызван из моего макета TextView (TextView будет нажатаесли вы нажмете его и вытяните палец из него, чтобы отпустить), и это не желаемое поведение, потому что я хочу:
щелкнуть = нажать + отпустить на TextView.

Может кто-нибудь дать мне решение дляэто пожалуйста?

Ответы [ 3 ]

21 голосов
/ 10 марта 2012

вы можете вызвать View.performClick (), когда action_up. Надеюсь, это поможет.

your_txtView.setOnClickListener(new TextView.OnClickListener(){
        public void onClick(View v) {
            // TODO Auto-generated method stub

        }
    });

    your_txtView.setOnTouchListener(new TextView.OnTouchListener(){
            @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (MotionEvent.ACTION_DOWN == event.getAction()) {

        } else if (MotionEvent.ACTION_UP == event.getAction()) {
            v.performClick();
        }

        return true;
    }
    });
3 голосов
/ 10 октября 2011

Адель, это проблема с первым кликом, или ты вообще не получаешь клик?

Существует эта проблема, если у вас есть несколько кликабельных макетов, вы не получаете никаких событий клика для первого. Это потому, что сначала он выбирается, а затем вы получаете событие click, попробуйте следующий код.

private class CustomTouchListener implements OnTouchListener {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        TextView tv = (TextView) v.findViewById(R.id.single_line_text);
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            tv.setTextColor(COLOR_WHEN_PRESSED);
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            tv.setTextColor(COLOR_WHEN_RELEASED);
            // Action of click goes here
        } else if (event.getAction() == MotionEvent.ACTION_CANCEL) {
            tv.setTextColor(COLOR_WHEN_RELEASED);
                            // To handle release outside the layout region
        }
        return false;
    }
}

Это работает в моей текущей реализации, если вы установите сенсорный приемник для вашего макета.

Вы также должны установить ниже на вашем макете

android:focusable="true"
android:focusableInTouchMode="true"
android:clickable="true"

Надеюсь, это поможет !!!

РЕДАКТИРОВАТЬ: Кроме того, должен быть флаг и вниз, и вверх. Установите его в DOWN и проверьте, установлен ли он в UP. Это позволит избежать ошибки, когда пользователь может нажать в любом месте экрана, а затем навести курсор на текстовое представление и отпустить его.

2 голосов
/ 30 апреля 2012

Была такая же проблема. Решил это, вернув false из ACTION_MOVE. Я боролся с этим в течение нескольких часов, пробуя разные вещи, но, похоже, я продолжал упускать из виду эту маленькую проблему ... И теперь это имеет смысл. Когда вы возвращаете true из onTouch, дальнейшая обработка останавливается, поэтому OnClickListener не знает о каких-либо движениях и запускает onClick даже после того, как указатель переместился за пределы вида.

...