Android OnTouch не выполняет команду возврата

эта проблема сводит меня с ума. Я уверен, что делаю что-то не так, но я не могу понять это.

У меня есть статический OnTouchListener, который я прикрепляю к TextView ряда идентичных составных объектов представления, содержащихся в linearlayout. Этот слушатель находится во вспомогательном классе.

    public static View.OnTouchListener getValueTouchListener() {
    return new View.OnTouchListener() {
        private int lastY;
        private int lastX;

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            TextView view = (TextView)v;
            int action = event.getActionMasked();
            switch (action) {
                case MotionEvent.ACTION_DOWN:
                    view.setBackgroundResource(R.drawable.cog_pressed);
                    lastY = (int)event.getY();
                    lastX = (int)event.getX();
                    return true;
                case MotionEvent.ACTION_MOVE:
                    //calc size of movement
                    int deltaY = lastY - (int)event.getY();
                    int deltaX = lastX - (int)event.getX();
                    // pass gesture up to parent if it's a big x movement - assumes user wishes to scroll parent
                    if (Math.abs(deltaX) > TOUCH_SLOP *2) {
                        return false;
                    }
                    lastX = (int)event.getX();
                    //process movement if larger than a touch slop
                    if (StrictMath.abs(deltaY) > TOUCH_SLOP) {
                        // reset last touch position
                        lastY = (int)event.getY();
                        //get direction of movement
                        int dir = (deltaY < 0)? -1 : 1;
                        //change index if within min and max limits
                        int min = (view.getTag() == Chainring.KEY)? Chainring.MIN_COG : Sprocket.MIN_COG;
                        int max = (view.getTag() == Chainring.KEY)? Chainring.MAX_COG : Sprocket.MAX_COG;
                        int value = Integer.valueOf(view.getText().toString());
                        if ((dir == -1 && value > min) || (dir == 1 && value < max)) {
                            value = value + dir;
                            view.setText(String.valueOf(value));
                            view.playSoundEffect(SoundEffectConstants.CLICK);
                        }
                    }
                    return true;
                case MotionEvent.ACTION_UP:
                    view.setBackgroundResource(R.drawable.cog_unpressed);
                    return true;
                case MotionEvent.ACTION_CANCEL:
                    view.setBackgroundResource(R.drawable.cog_unpressed);
                    return false;
                default:
                    return false;
            }
        }
    };
}

Я подключаю этот слушатель к моему TextView в классе, который расширяет линейную компоновку.

        mValueTextView.setOnTouchListener(CogPickerHelper.getValueTouchListener());

Моя проблема в том, что метод не выполняет команду возврата в случаях ACTION_DOWN, ACTION_UP и ACTION-MOVE. Например, с ACTION_DOWN код выполняется до команды return, но затем переходит непосредственно к случаю по умолчанию и возвращает false, даже несмотря на то, что Logcat по-прежнему сообщает о действии как ACTION-DOWN.

Если я пытаюсь установить точку останова для команд возврата, IntelliJ говорит: «В строке X в классе com.amb.GearBuddyV2.views.CogPickerHelper$2 не найден исполняемый код».

Кто-нибудь знает, что я делаю неправильно здесь?


person Ambie    schedule 09.11.2013    source источник


Ответы (1)


Ваш код работает нормально, возвращаемое значение OnTouch возвращается правильно.

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

person kheld    schedule 09.11.2013
comment
Я думаю, что это моя точка зрения, код не работает. Я не могу вернуть true в первых трех случаях, поэтому я в принципе не могу использовать событие... и, по логике, я не понимаю, как переключатель может перейти к двум случаям за один и тот же проход, когда каждый случай заканчивается заявление о возврате. Кроме того, я могу добавить точку останова в операторе return в случае ACTION_CANCEL, который, что раздражает, вернет значение и позволит мне использовать событие. - person Ambie; 09.11.2013
comment
Отладка, кажется, абсурдно приводит вас к двум различным случаям, вероятно, из-за оптимизации кода переключения, выполненной компилятором, и отладчик не может очень хорошо сопоставить его с фактическим источником. Вы пытались использовать логическую переменную, чтобы сначала сохранить возвращаемое значение, а не возвращать его немедленно? Отладчик должен позволить вам выполнить это простое назначение переменной и показать, что именно назначается для возврата. - person kheld; 09.11.2013
comment
Спасибо за комментарии, хелд. Я создал логическое значение, а затем завершил каждый случай командой break ... и это действительно работает так, как вы ожидаете. Я соглашусь с этим планом - просто позор, я не могу понять, почему один работает, а другой нет. - person Ambie; 09.12.2013