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.

  • El apagado del emulador de Android toma FOREVER
  • Cargadores de Android, el camino a seguir?
  • Optimización de AndEngine juego
  • Aplicación para Android de Facebook: expiración de token de acceso (expires_in) siempre es 0
  • No se puede iniciar el servicio Intención: no se encuentra
  • Uso de ListView: ¿Cómo agregar una vista de encabezado?
  • ¿Algún consejo?

    Gracias, Víctor

  • Utilizando el SDK de Android en un Mac, Eclipse es muy lento. ¿Cómo puedo acelerarlo?
  • Adb no se reconoce como comando interno o externo en Windows
  • Controlador Prestigio Multipad PMP3370B USB
  • Android personalizar stackview
  • Java.lang.SecurityException: inválido nombre del paquete: com.google.android.gms
  • Cualquier ejemplo que muestre cómo iniciar sesión con Facebook SDK 4.0 en Android, ya sea utilizando el botón propio o el botón de Facebook?
  • 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.