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.

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 .

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.

  • Resalta textview para saber que se puede hacer clic
  • Colocación de una vista de texto en la parte superior de la vista de la imagen en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.