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 –
- Cómo setOnTouchListener () en un ListPreference?
- Gire la vista de disposición de androide sobre su centro usando el oyente táctil
- ¿Qué sucede realmente si devuelvo falso en un OnTouchListener?
- Problema en OnTouchListener para ImageView
- Incorporación de ListView dentro de la Galería
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.
- Android: OnTouch, MotionEvent.ACTION_MOVE no está reconocido?
- Ver sólo el registro de MotionEvent.ACTION_DOWN
- Limitación de Drag de ImageView en Android
- Disparar Evento táctil desde la vista DialogFragment a la vista de actividad principal
- Android: ¿Qué uso tiene AnchorView de MediaController?
- Ocultar teclado en android mientras se toca fuera Editar área de texto
- Android: Detectar el botón ACTION_UP fuera del evento
- Arrastrar y soltar imágenes en android
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) {}
- WearableListView setEnableGestureNavigation no disponible
- Vista galería androide "tartamudea" con adaptador de carga de imagen diferida