私はスマートウォッチ用のスタンドアロンアプリを開発しました。Touch
が少なくとも3秒間続いたかどうかを検出し、場合。 (MotionEvent
がアップしているときfalse
に設定されているシンプルなブール状態とHandler
上PostDelayed
アクション)removeCallbacks()は、ハンドラ内の指定されたRunnableを削除していないようです
private int longClickDuration = 3000;
private boolean isLongPress = false;
static Runnable longTouchRunnable;
mContainerView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
longTouchRunnable = new Runnable() {
@Override
public void run() {
if (isLongPress) {
Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
long[] vibrationPattern = {0, 500, 50, 300};
//-1 - don't repeat
final int indexInPatternToRepeat = -1;
vibrator.vibrate(vibrationPattern, indexInPatternToRepeat);
// set your code here
setStateStarting(); //Block the GUI, only one click and waiting for tablet
presenter.onStartClick();
Log.d("Long","LONG CLICK PERFORMED");
// Don't forgot to add <uses-permission android:name="android.permission.VIBRATE" /> to vibrate.
}
}
};
switch (currentState) {
case START: {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
isLongPress = true;
Log.e("Long touch","Start");
myUIHandler.postDelayed(longTouchRunnable, longClickDuration);
} else if (event.getAction() == MotionEvent.ACTION_UP) {
isLongPress = false;
myUIHandler.removeCallbacks(longTouchRunnable);
Log.e("Long touch", "Stop");
}
return true;
}
}
return false;
}
});
私の問題: すべてが完璧に動作をすることを期待する。ここ
は、私が使用するコードですRunnable
は必要なときに削除されていないようです。 - >ビューで2回すばやくクリックしてから3回目に押して保持している場合(3秒後に表示されるのブール値状態は
true
)、3回実行します。 >
Runnable
タスクは
ACTION_UP
イベントで削除されませんでした。
情報:予想通りのメッセージのデバッグはプロンプトです...
はどうすれば適切にhandler
にpostdelayedたRunnable
を破壊することができますか?
おかげで、それは言うremoveCallbacksAndMessagesのためのドキュメントで
あなたの迅速な答えに感謝します! しかし、私はすべてのメッセージと私のUIHandlerのコールバックを殺すしたくない... それは私がmyUIHandler.removeCallbacks(longTouchRunnable)を使用した理由です。 特定の対象となるRunnableについて。 期待どおりに機能しないのはなぜですか? – AndroDev
@AndroDev私は答えを編集しました:) – tamtom
PER-FECT! アドバイスに従って問題を解決する方法を見つけました。ありがとうございます! 注:MyRunnableでkillRunnable()を呼び出す必要があり、ハンドラに注意してください。 – AndroDev