Android - пользовательская кнопка застревает "нажата" - PullRequest
0 голосов
/ 16 мая 2011

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

private void registerListeners() {

    calcButton.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            calcButton.requestFocusFromTouch();
            calcButton.setImageResource(R.drawable.calc_button_pressed);
            return false;
        }
    });

    calcButton.setOnFocusChangeListener(new View.OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            calcButton.setImageResource(R.drawable.calc_button_not_pressed);
        }
    });

    calcButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {           
            mathCalculation();
            calcButton.setImageResource(R.drawable.calc_button_not_pressed);
        }
    });
}

Моя проблема заключается в том, что существует «ошибка», при которой, если пользователь касается кнопки и перетаскивает свою фигуру с кнопки, кнопка остается нажатой. Одна из работ, которые я реализовал выше, это "setOnFocusChangeListener", поэтому, как только пользователь выберет что-то еще, он снова появится.

Я хочу, чтобы кнопка выскочила обратно, когда пользователь перетаскивает прикосновение к кнопке.

Все предложения приветствуются !!!

Спасибо,

Ответы [ 4 ]

4 голосов
/ 16 мая 2011

Вам не нужно писать отдельный класс кнопки, чтобы получить такое поведение, вы можете реализовать его через отрисовываемый XML. Имейте это в своем xml и установите это как фон для своей кнопки:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
      android:drawable="@drawable/calc_button_pressed" />
    <item android:drawable="@drawable/calc_button_not_pressed" />
</selector>
3 голосов
/ 16 мая 2011

В вашем методе onTouch проверьте действие события.

  • Если это MotionEvent.ACTION_DOWN, продолжайте, как вы.
  • Если это ACTION_UP или ACTION_CANCEL, то позвоните calcButton.setImageResource(R.drawable.calc_button_not_pressed);

http://developer.android.com/reference/android/view/MotionEvent.html

1 голос
/ 16 мая 2011

Это потому, что событие щелчка «происходит» только при касании и отпускании .Если вы трогаете и выходите наружу, это не щелчок.

Чтобы сделать то, что вы хотите, используйте StateListDrawable , это сделано именно для этого.

1 голос
/ 16 мая 2011

Вы могли бы использовать использовать onTouch. Затем используйте ACTION_OUTSIDE, который срабатывает, когда пользователь касается касания, выходит за границы представления.

Изменить 1: чтобы быть более конкретным:

OnTouchListener(MotionEvent e) {
   switch(e.getAction()) {
      case MotionEvent.ACTION_OUTSIDE: // switch the image if the button
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...