Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


En Android – ¿Cómo puedo registrar solo clics largos usando un ClickableSpan

Me gustaría registrar clics en un texto envuelto en un ClickableSpan sólo si se hace clic durante más de decir 1 segundo. ¿Hay alguna manera de hacer esto? Si no, capturar un doble clic también estaría bien.

Sería genial si el método onClick capturara un evento que tuviera algunos metadatos sobre el clic – entonces podría decir ignorar si la longitud del clic era corta.

¿Algún consejo?

Gracias, Víctor

  • ¿Cómo personalizar el mecanismo de sugerencias automáticas "chips", como se usa en el campo de destinatarios de Gmail?
  • Desplácese hacia arriba cuando aparezca el teclado
  • Cómo mostrar la fecha seleccionada en EditText utilizando DialogFragment
  • Dibujar varias líneas en edittext, por ejemplo, bloc de notas
  • Android EditText y el botón en la misma línea
  • La pista EditText de Android no aparece
  • EditarTexto
  • ¿Por qué mi menú de edición / copia de EditText se encuentra debajo de EditText? ¿Cómo cambiar el orden z de la ventana emergente?
  • 2 Solutions collect form web for “En Android – ¿Cómo puedo registrar solo clics largos usando un ClickableSpan”

    En caso de que alguien lo necesite, lo encontré en este lugar

    package leeon.mobile.BBSBrowser; import android.text.Layout; import android.text.Selection; import android.text.Spannable; import android.text.method.LinkMovementMethod; import android.text.method.MovementMethod; import android.view.MotionEvent; import android.widget.TextView; public class LongClickLinkMovementMethod extends LinkMovementMethod { private Long lastClickTime = 0l; private int lastX = 0; private int lastY = 0; @Override public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { int action = event.getAction(); if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { int x = (int) event.getX(); int y = (int) event.getY(); lastX = x; lastY = y; int deltaX = Math.abs(x-lastX); int deltaY = Math.abs(y-lastY); x -= widget.getTotalPaddingLeft(); y -= widget.getTotalPaddingTop(); x += widget.getScrollX(); y += widget.getScrollY(); Layout layout = widget.getLayout(); int line = layout.getLineForVertical(y); int off = layout.getOffsetForHorizontal(line, x); LongClickableSpan[] link = buffer.getSpans(off, off, LongClickableSpan.class); if (link.length != 0) { if (action == MotionEvent.ACTION_UP) { if (System.currentTimeMillis() - lastClickTime < 1000) link[0].onClick(widget); else if (deltaX < 10 && deltaY < 10) link[0].onLongClick(widget); } else if (action == MotionEvent.ACTION_DOWN) { Selection.setSelection(buffer, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0])); lastClickTime = System.currentTimeMillis(); } return true; } } return super.onTouchEvent(widget, buffer, event); } public static MovementMethod getInstance() { if (sInstance == null) sInstance = new LongClickLinkMovementMethod(); return sInstance; } private static LongClickLinkMovementMethod sInstance; } [1]: http://java2s.com/Open-Source/Java/SSH/brick-leeon/leeon/mobile/BBSBrowser/LongClickLinkMovementMethod.java.htm 

    LongClickableSpan en el mismo lugar:

      package leeon.mobile.BBSBrowser; import android.text.style.ClickableSpan; import android.view.View; public abstract class LongClickableSpan extends ClickableSpan { abstract public void onLongClick(View view); } 

    Quiero hacer lo mismo, el único método que viene a la mente es la clase personalizada de MovementMethod que reemplaza a LinkMovementMethod y un reemplazo para ClickableSpan que añade un método abstracto de clic largo. En realidad es bastante simple:

    1. Descargue la fuente de Android y localice las clases LinkMovementMethod y ClickableSpan
    2. Crear la clase MyCustomClickableSpan de ClickableSpan con el método abstracto agregado onLongClick ()
    3. Cree la clase MyCustomLinkMovementMethod de LinkMovementMethod donde onTouchEvent se personaliza para que llame a MyCustomClickableSpan onLongClick () en el lugar correcto
    4. Utilice las nuevas clases en su código en lugar de LinkMovementMethod y ClickableSpan

    EDIT : Funciona como un encanto. He cometido algunos errores estúpidos como descargar LinkMovementMethod desde diferentes versiones de Android y no usar la nueva clase ClickableSpan en setSpan (), pero nada grave.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.