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 cambio de permiso dinámico de marshmallow de Android mata todos los procesos de aplicación
  • Android ListView addHeaderView () nullPointerException para vistas predefinidas definidas en XML
  • ¿Interrupción de línea en formato XML?
  • ¿Cuál es la manera más simple de invertir un ArrayList?
  • Patrón de panel de control Android
  • Cómo implementar un oyente de clic largo en un listview
  • ¿Algún consejo?

    Gracias, Víctor

  • EOFException en Retrofit al ejecutar peticiones PUT síncronas
  • Android View.getDrawingCache devuelve null, sólo null
  • Cómo cambiar el icono de navegación de la barra de herramientas y el margen del menú de opciones
  • Extensión de Spanned, SpannedString, Spannable, SpannableString y CharSequence de Android
  • Elementos de menú ActionBar desaparecen en NestedFragments
  • ¿Cómo utilizar correctamente Google Plus Iniciar sesión con múltiples actividades?
  • 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.