我试图看看有没有办法创建一个方法来实现多个按钮的触摸监听器,因为我有很多按钮几乎完全相同的事情.他们所做的唯一区别是他们将通过我的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()中有一个使用布尔值的Log调用,我希望看到它被传递时的设置.这是在释放按钮期间调用它的唯一原因.
解决方法
是的你是对的,还有更好的方法.一个TouchListener,用于处理所有内容,通过id确定它是哪个按钮.
void intialization(){ Button m1,m2,m3,m4; ... //do initialization stuff m1.setId(1); m2.setId(2); m3.setId(3); m4.setId(4); MyTouchListener touchListener = new MyTouchListener(); m1.setOnTouchListener(touchListener); m2.setOnTouchListener(touchListener); m3.setOnTouchListener(touchListener); m4.setOnTouchListener(touchListener); } public class MyTouchListener implements OnTouchListener { @Override public boolean onTouch(View v,MotionEvent event) { switch(v.getId()){ case 1: //do stuff for button 1 break; case 2: //do stuff for button 2 break; case 3: //do stuff for button 3 break; case 4: //do stuff for button 4 break; } return true; } }
这就是你如何做到的!在这种情况下,id的数值方法非常有用.另一种方法是让您的活动在您的活动中实现OnTouchListener,然后您的代码将更加简单.
public class MyActivity extends Activity implements OnTouchListener { void initialization(){ Button m1,m4; ... //do initialization stuff m1.setId(1); m2.setId(2); m3.setId(3); m4.setId(4); m1.setOnTouchListener(this); m2.setOnTouchListener(this); m3.setOnTouchListener(this); m4.setOnTouchListener(this); } @Override public boolean onTouch(View v,MotionEvent event) { switch(v.getId()){ case 1: //do stuff for button 1 break; case 2: //do stuff for button 2 break; case 3: //do stuff for button 3 break; case 4: //do stuff for button 4 break; } return true; } }
注意:此方法也适用于OnClickListener,OnCheckedChangeListener或您将在Android视图上设置的任何其他侦听器.