ほぼ同じことを行うボタンがかなりあるので、複数のボタンのタッチリスナーを実装する単一のメソッドを作成する方法があるかどうかを確認しようとしています。彼らが行うことの唯一の違いは、sendMessage() メソッドを介して送信するメッセージと、メッセージを送信するためにボタンを押し続ける必要がある時間です。それを行う方法があるとすれば、それはどのようなものでしょうか? また、なぜこのようなものがうまくいかないのでしょうか?
//Within onCreate Method...
Button mButton = (Button) findViewbyId(R.id.three_sec_button);
mButton = addTouchTimer(mButton, 3, 3);
通話 -
private Button addTouchTimer(Button button, final int sec, final int messageNum){
button.setOnTouchListener(new View.OnTouchListener() {
boolean longEnough = false;
long realTimeLeft = sec * 1000;
@Override
// This will make it so that a message is only sent if the button is held down for 3 seconds
// Otherwise it won't send. It is sent during the hold down process, releasing it returns a false
// value and no message is sent.
public boolean onTouch(View arg0, MotionEvent arg1) {
Log.d("Button", "Touchy Touchy!");
if(arg1.getAction() == MotionEvent.ACTION_DOWN){
buttonPressTime = new CountDownTimer(realTimeLeft, 1000){
@Override
public void onTick(long millisUntilDone){
realTimeLeft = millisUntilDone;
}
@Override
public void onFinish() {
long timeLeft = realTimeLeft;
long currTime = System.currentTimeMillis();
long realFinishTime = currTime + timeLeft;
while(currTime < realFinishTime){
currTime = System.currentTimeMillis();
}
longEnough = true;
sendEmergencyMessage(longEnough, messageNum);
}
}.start();
}
else if(arg1.getAction() == MotionEvent.ACTION_UP){
buttonPressTime.cancel();
sendMessage(longEnough, messageNum);
}
return longEnough;
}
});
return button;
}
効率のために、ボタンごとに個別のリスナーを実装するよりも良い方法が必要なようです。注意として、 sendMessage() にはブール値を利用するログ呼び出しが含まれています。渡されたときにどのように設定されているかを確認したいと思います。これが、ボタンを離すときに呼び出される唯一の理由です。