Обратный отсчет на кнопке - Android - PullRequest
1 голос
/ 12 февраля 2012

Я хочу реализовать кнопку, которая ведет обратный отсчет при нажатии.Идея состоит в том, чтобы позволить пользователю отменить активацию кнопки.После нажатия я бы хотел, чтобы кнопка поменяла цвет на красный и прочитала «ОТМЕНА (3)», а обратный отсчет - «ОТМЕНА (0)», и при повторном нажатии обратный отсчет прекратится и ничего не произойдет.Если это не отменено, приложение перейдет к следующему экрану по истечении времени.Есть ли способ обновлять текст кнопки каждую секунду (для обратного отсчета) и изменять ее функциональность?

Спасибо

1 Ответ

4 голосов
/ 12 февраля 2012

Вы можете использовать postDelayed в обработчике для последующего вызова вашего метода в потоке пользовательского интерфейса, чтобы вы могли обновить пользовательский интерфейс.

На самом деле есть очень хорошая статья о том, как это делается на Android:http://developer.android.com/resources/articles/timed-ui-updates.html

Вы можете получить обработчик, либо создав его в коде, выполняемом в потоке пользовательского интерфейса, либо вызвав getHandler() для представления (например, самой кнопки).

I 'Можно привести пример, но ссылка на статью уже делает это с большой детализацией и ясностью, поэтому я откладываю на это.

Редактировать : вот приблизительный обзор того, как это будет выглядеть.У меня сейчас нет установленного Android SDK, поэтому я не могу убедиться, что это работает.

public class CountdownButton extends Button {
  private boolean isCounting = false;
  private int count;

  private final Runnable countdownRunnable = new Runnable() {
    @Override
    public void run() {
      setText(Integer.toString(count));
      if (count > 0) {
        count--;
        getHandler().postDelayed(countdownRunnable, 1000);
      } else {
        // count reached zero
        isCounting = false;
        setText("boom");
      }
    }
  }

  private final View.OnClickListener onClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      if (isCounting) {
        // stop counting
        isCounting = false;
        getHandler().removeCallbacks(countdownRunnable);
        setText("cancelled");
      } else {
        // start counting
        isCounting = true;
        count = 10;
        countdownRunnable.run();
      }
    }
  }

  public CountdownButton(Context context) {
    super(context);
    setOnClickListener(onClickListener);
  }

  public CountdownButton(Context context, AttributeSet attrs) {
    super(context, attrs);
    setOnClickListener(onClickListener);
  }

  public CountdownButton(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    setOnClickListener(onClickListener);
  }
}

Время может быть не идеальным (особенно если выполняется много других операций с процессором), но это должно быть достаточно для ваших целей.

...