OnClick posición en cadena en TextView
No estoy seguro de cómo hacer esto, pero me preguntaba si había una manera de obtener la posición (índice) en una cadena en un TextView cuando una persona hace clic en algún lugar en el TextView. Por lo tanto, si alguien hace clic en el texto siguiente:
Hello I'm Vinay Hiremath.
En el primer 'H', el evento onClick obtendrá el número entero 0. O, si alguien hace clic en el 'V', obtendrá 10, y así sucesivamente.
- ¿Cómo hacer efecto bling en textview en clic?
- ¿Cómo agregar onclicklistener a la vista de texto generada dinámicamente?
- Android, ¿Cómo puedo obtener texto de TextView en OnClick
- Establecer el ancho de TextView en términos de caracteres
- Android Múltiples secuencias de clics en textview
Cualquier ayuda, como siempre, es muy apreciada. Siéntase libre de llamarme un idiota y tirar piedras si esto es descaradamente en los desarrolladores de Android .
- ¿Agregar nuevas líneas a un recurso de texto en Android?
- Actualizar textView desde el hilo
- Aplicar estilo de Android a TextView personalizado
- ¿Mostrando la hora actual en Android y actualizarla?
- Personalización del icono setError para TextView
- Cómo puedo dibujar texto en una vista en un patrón circular en Android
- Android gire TextView en nivel de API> = 8
- Android: ¿Por qué el método onClick no funciona?
Así que terminé por resolver esto a través del enlace en el comentario de James Moore aquí . Terminé usando la solución de Tony Blues en ese enlace. Esa solución es la siguiente:
1.) Establezca un onTouchListener en TextView.
2.) Obtener el diseño de TextView.
3.) Obtenga las coordenadas x, y del toque a través del evento.
4.) Encuentra la línea y el desplazamiento (índice) en función de ese evento.
El siguiente ejemplo de código es cómo se podría registrar (en verboso) el índice de un toque dado un TextView llamado manip:
manip.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { Layout layout = ((TextView) v).getLayout(); int x = (int)event.getX(); int y = (int)event.getY(); if (layout!=null){ int line = layout.getLineForVertical(y); int offset = layout.getOffsetForHorizontal(line, x); Log.v("index", ""+offset); } return true; } });
EDIT: Rahul Mandaliya ha señalado a mi atención que este código fallará si hay relleno en la vista de texto. Lamentablemente, ha pasado mucho tiempo desde que escribí cualquier código de Android, así que no estoy seguro de cómo actualizar esta respuesta para tener en cuenta que. Intuitivamente, parece que podría hacer algún tipo de comprobación contra el evento de clic si conoce el valor de relleno. Siento no ser capaz de ser más útil en este caso de borde. Unesdoc.unesco.org
Si está siguiendo la respuesta aceptada, puede notar que el evento onTouch
se levanta más de una vez cada vez que el usuario toca la pantalla. Utilice event.getAction()
para averiguar qué acción se está manejando. Esto depende del comportamiento del usuario que generó el evento. Por ejemplo, para un simple toque en la pantalla, el evento onTouch
se disparará dos veces con las acciones ACTION_DOWN
y ACTION_UP
. Para un toque y movimiento, obtendrá diferentes acciones dependiendo del movimiento (dentro del control, de afuera a dentro, o viceversa). Para más detalles verifique el MotionEvent .
El siguiente código es una versión modificada de la respuesta aceptada que sólo controla la acción ACTION_DOWN
:
manip.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { Layout layout = ((TextView) v).getLayout(); int x = (int)event.getX(); int y = (int)event.getY(); if (layout!=null){ int line = layout.getLineForVertical(y); int offset = layout.getOffsetForHorizontal(line, x); Log.v("index", ""+offset); } } return true; } });
1) Tome una lista.
2) dividir esta cadena en un carácter separado.
3) tomar setOnItemClickListener (nuevo evento OnItemClickListener ()).
4) muestran Toast para cada personaje por los args get de charcter.
Esto te ayudará.
Tome esto con una pizca de sal, ya que no tuve la oportunidad de probarlo.
Establezca el atributo android:textIsSelectable
como true
para TextView
y luego utilice los getSelectionStart()
y getSelectionEnd()
.
Otra vez estoy realmente haciendo una conjetura educada.