Método único para implementar onTouchListener () para varios botones

Estoy tratando de ver si hay una manera de crear un método único para implementar un oyente de tacto para varios botones, viendo como tengo unos cuantos botones que hacen casi exactamente lo mismo. La única diferencia en lo que hacen es el mensaje que enviarían a través de mi método sendMessage () y cuánto tiempo debe mantenerse presionado el botón para que el mensaje se envíe. Si hay una manera de hacerlo, ¿qué podría ser? Y también, ¿por qué no algo así funcionaría?

//Within onCreate Method... Button mButton = (Button) findViewbyId(R.id.three_sec_button); mButton = addTouchTimer(mButton, 3, 3); 

Llamadas –

 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; } 

Simplemente parece que por razones de eficiencia tiene que haber una mejor manera de hacerlo que implementar oyentes individuales para cada botón. Como nota, sendMessage () tiene una llamada de registro en ella que utiliza el valor booleano, quiero ver lo que se establece como cuando se pasa. Esa es la única razón por la que se llama durante el lanzamiento del botón.

Sí, tienes razón, hay una mejor manera. Un solo TouchListener que maneja todo, determinando qué botón es a través del 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; } } 

Y así es como lo harías! Un enfoque numérico para los id's es muy útil en este caso. Otro enfoque es que su actividad implemente el OnTouchListener en su actividad y, a continuación, su código sería aún más simple.

 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; } } 

Nota: Este enfoque también funcionará para OnClickListener, OnCheckedChangeListener o cualquier otro oyente que establezca en una vista de Android.

Sí, hay un mejor enfoque para hacer lo mismo.
1) Haga que su clase implemente OnTouchListener .
2) Agregue este escucha a cada botón que debe manejar el evento táctil. Me gusta esto:

 button1.setOnTouchListener(this); 

3) Y en este public boolean onTouch(View arg0, MotionEvent arg1) {});

Método que puede utilizar caso de cambio en la vista que fue tocado. El primer argumento, es decir, arg0 es la vista a la que se ha enviado el evento táctil. En su caso serán botones diferentes. Algo como esto:

 public boolean onTouch(View arg0, MotionEvent arg1) { if (arg1.getAction() == MotionEvent.ACTION_DOWN) { switch (arg0.getId()) { case R.id.button1: // Id of the button // Your code goes here break; case R.id.button2: // Id of the button // Your code goes here break; default: break; } } return true; } 

Con ButterKnife sería así. (En mi caso ImageView como botones)

 @OnTouch({R.id.Button1, R.id.Button2, R.id.Button3}) public boolean buttonsTouched(ImageView button, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: --(Your ACTION on Pressed)-- return true; case MotionEvent.ACTION_UP: --(Your ACTION on Release)-- return true; } return true; } 
 OnTouchListener mOnTouchListener = new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // Code goes here return true; } }; button1.setOnTouchListener(mOnTouchListener); button2.setOnTouchListener(mOnTouchListener); 

Me fusiono dos respuestas, este es mi código

 public class MyActivity extends Activity implements OnTouchListener { Button mGreen, mRed; void initialization() { ... //do initialization stuff mGreen.setOnTouchListener(this); mRed.setOnTouchListener(this); } @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: actionDown(); break; case MotionEvent.ACTION_UP: actionUp(); break; case MotionEvent.ACTION_POINTER_DOWN: break; case MotionEvent.ACTION_POINTER_UP: break; case MotionEvent.ACTION_MOVE: actionMove(); break; } return true; } public void actionDown() { switch (view.getId()) { case R.id.button_green: //todo break; case R.id.button_red: //todo break; } } public void actionUp() { switch (view.getId()) { case R.id.button_green: //todo break; case R.id.button_red: //todo break; } } public void actionMove() { switch (view.getId()) { case R.id.button_green: // todo break; case R.id.button_red: // todo break; } }} 

Espero que este código ayude a alguien

¿Por qué no usas butterknife?

 @Nullable @OnClick({R.id.btn1, R.id.btn2,R.id.btn3, R.id.btn4}) public void doStuff(Button button) {} 
  • EditText en ListView pierde foco cuando se presiona en Android 4.x
  • Cómo agregar la funcionalidad de deslizar en Android CardView?
  • ¿Cómo puedo pasar Touch Listeners a la vista personalizada para arrastrar y soltar?
  • ¿Es OnTouchListener más rápido que OnClickListener?
  • Cómo implementar OnTouch Listener en XML
  • Obtener coordenadas reales de xy de los usuarios
  • PopupWindow TouchInterceptor no funciona
  • Tiempo de aumento de OnLongPress
  • ¿Cómo puedo mantener los eventos de ontouch manejados por un widget incluso si las coordenadas de tacto ya no están dentro del widget, en android
  • "Presione y mantenga presionado" en Android necesita cambiar estados (selector XML personalizado) usando onTouchListener
  • cómo deslizar un evento button onTouch en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.