我想看看是否有一种方法可以创建一个方法来实现多个按钮的触摸侦听器,因为我有很多按钮几乎可以完成相同的操作。他们所做的唯一区别是他们通过我的 sendMessage() 方法发送的消息,以及需要按住按钮多长时间才能发送消息。如果有办法做到这一点,那会是什么?而且,为什么这样的东西不起作用呢?
//Within onCreate Method...
Button mButton = (Button) findViewbyId(R.id.three_sec_button);
mButton = addTouchTimer(mButton, 3, 3);
Calls -
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, m2, m3, 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 视图上设置的任何其他侦听器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)