72

「開く」アニメーションがあり、少し遅れて「閉じる」Handler.postDelayed(Runnable, delay)アニメーションをトリガーするために使用しています。ただし、開いてから閉じるまでの間に、クリックによってトリガーされる別のアニメーションが存在する可能性があります。

私の質問は、ハンドラーの「閉じる」アニメーションをキャンセルするにはどうすればよいですか?

4

4 に答える 4

102

removeCallbacks(Runnable r)メソッドを使用するだけです。

于 2010-09-02T13:10:52.863 に答える
99

Cristianの回答は正しいですが、回答のコメントに記載されている内容とは対照的に、実際には、をRunnables呼び出すことで匿名のコールバックを削除できます。removeCallbacksAndMessages(null);

ここで述べたように:

objがトークンであるコールバックと送信済みメッセージの保留中の投稿をすべて削除します。トークンがnullの場合、すべてのコールバックとメッセージが削除されます。

于 2013-02-10T15:40:16.610 に答える
17

これは遅い答えですが、ハンドラーから特定のカテゴリのランナブルのみを削除したい場合の別の方法があります(つまり、OPの場合は、閉じるアニメーションを削除して、他のランナブルをキューに残します)。

    int firstToken = 5;
    int secondToken = 6;

    //r1 to r4 are all different instances or implementations of Runnable.  
    mHandler.postAtTime(r1, firstToken, 0);
    mHandler.postAtTime(r2, firstToken, 0);
    mHandler.postAtTime(r3, secondToken, 0);

    mHandler.removeCallbacksAndMessages(firstToken);

    mHandler.postAtTime(r4, firstToken, 0);

上記のコードは「r3」を実行し、次に「r4」のみを実行します。これにより、ランナブル自体への参照を保持する必要なしに、トークンによって定義されたランナブルの特定のカテゴリを削除できます。

注:ソースコードは「==」オペランドのみを使用してトークンを比較するため(.equals()は呼び出されません)、トークンには文字列の代わりにint/Integersを使用するのが最適です。

于 2015-06-18T01:58:05.733 に答える
11

再帰を使用している場合は、「this」を渡すことでこれを実現できます。以下のコードを参照してください。

public void countDown(final int c){
    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            aq.id(R.id.timer).text((c-1)+"");
            if(c <= 1){
                aq.id(R.id.timer).gone();
                mHandler.removeCallbacks(this);
            }else{
                countDown(c-1);
            }
        }
    }, 1000);
}

この例では、TextView(タイマー)のテキストを毎秒設定し、カウントダウンします。0になると、UIからTextViewが削除され、カウントダウンが無効になります。これは再帰を使用している人にのみ役立ちますが、私はそれを探してここに到着したので、結果を投稿しています。

于 2012-01-24T02:45:23.187 に答える