2012-02-12 13 views
1

私は押したときにカウントダウンするボタンを実装したいと思います。この考え方は、ユーザーがボタンのアクティベーションをキャンセルできるようにすることです。一度押すと、ボタンが赤色に変わり、「CANCEL(3)」と「CANCEL(0)」にカウントダウンし、もう一度押すとカウントダウンが停止し、何も起こりません。キャンセルされていない場合は、時間切れ後に次の画面に移動します。 1秒ごとにボタンのテキストを更新し(カウントダウンのために)、その機能を変更する方法はありますか?ボタンのカウントダウン - Android

おかげ

+0

asynctaskを使用してボタンのテキストを更新します。 –

答えて

4

あなたはUIを更新できるように、後にUIスレッド上で、あなたのメソッドを呼び出すためにHandlerでpostDelayedを使用することができます。

は、実際に、これはすでにAndroid上でどのように行われるかについては非常に素晴らしい記事があります:http://developer.android.com/resources/articles/timed-ui-updates.html

あなたは、またはビューにgetHandler()を呼び出すことによって、UIスレッド上で実行されているコードに1を作成することにより、いずれかのハンドラを取得することができます(たとえば、あなたのボタン自体)。

私は例を挙げておきますが、リンクされている記事は既に非常に詳細で明快になっていますので、私はそれを延期します。

を編集します。これはどのように見えるかについての概要です。私は今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); 
    } 
} 

タイミングは、(起こっている他のCPUの多くの作業があります場合は特に)完璧ではないかもしれないが、それはあなたの目的のために十分に良いことがあります。

+0

それは正しい方向のように見えます。ボタンのテキストをどのように更新すればよいですか? – mkyong

+0

'setText'(http://developer.android.com/reference/android/widget/TextView.html#setText%28java.lang.CharSequence%29)を呼び出して、ボタンのテキストを設定することができます。 –

+0

毎秒テキストを更新する方法の例を提供できると思いますか?私はsetTextとそれがどのように動作するのかを理解していますが、ハンドラは私を混乱させます。 – mkyong

関連する問題