2011-06-08 13 views
12

No estoy seguro de cómo hacerlo, pero me preguntaba si había una forma de obtener la posición (índice) en una cadena en un TextView cuando una persona hace clic en algún lugar del Vista de texto. Por lo tanto, si alguien hace clic en el siguiente TextView:OnClick Position in String en TextView

Hello I'm Vinay Hiremath. 

en el primer 'H', el evento de clic obtendrá el número entero 0. O bien, si alguien hace clic en el 'V', conseguirá 10, y pronto.

Cualquier ayuda, como siempre, es muy apreciada. Siéntase libre de llamarme idiota y tirar piedras si esto está descaradamente en Android Developers.

+1

Parece que estás pidiendo http://stackoverflow.com/questions/2302867/android-how- to-determined-character-index-of-a-touch-events-position-in-textview –

Respuesta

21

Así que terminé resolviendo esto a través del enlace en el comentario de James Moore here. Terminé usando la solución de Tony Blues en ese enlace. Esa solución es la siguiente:

1.) Establezca un onTouchListener en TextView.

2.) Obtenga el diseño de TextView.

3.) Obtenga las coordenadas x, y del toque mediante el evento.

4.) Encuentre la línea y el desplazamiento (índice) en función de ese evento.

El ejemplo de código es la forma en que uno log (en modo prolijo) 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 traído a mi atención que este código fallará si hay relleno en la vista de texto. Desafortunadamente, ha pasado mucho tiempo desde que escribí el código de Android, por lo que no estoy seguro de cómo actualizar esta respuesta para dar cuenta de eso. Intuitivamente, parece que podrías hacer algún tipo de verificación contra el evento de clic si conoces el valor de relleno. Perdón por no poder ser más útil en este caso extremo. :-(

+0

esto solo funciona cuando el ancho y el alto de diseño de textivew es el contenido del wrap-up. si realiza el ancho o el alto, rellene el origen y seleccione otro desplazamiento –

+0

@RahulMandaliya ¿Qué desplazamiento está seleccionado? Actualizaré mi respuesta, hace mucho tiempo que no hago nada de Android. :-P – Vinay

+0

simplemente agregue relleno en su vista de texto y luego haga clic en el texto exterior tiene que agregar la condición para la vista de texto como si (desplazamiento <= texto.length()) entonces su trabajo –

2

Toma esto con una pizca de sal, ya que no tuve oportunidad de probarlo.

establece el atributo android:textIsSelectable a true para la TextView y luego utilizar los métodos getSelectionStart() y getSelectionEnd().

Una vez más estoy realmente haciendo una conjetura educada.

+0

¡Muchas gracias por la excelente dirección de Octavian! Esto realmente sería muy útil para la funcionalidad futura que me gustaría en mi aplicación, si funciona. Sin embargo, cada vez que pongo "android: textIsSelectable =" true "" en mi diseño XML, me dice que "no se encontró ningún identificador de recursos para el atributo 'textIsSelectable' en el paquete 'android'". ¿Tienes alguna idea de lo que esto podría significar? Parece que alguien estaba enfrentando el mismo problema aquí: http://androidforums.com/application-development/330162-how-do-i-make-textview-text-selectable.html pero no obtuvo respuestas. Cualquier ayuda es apreciada. – Vinay

+0

Como nota al margen, entiendo que este problema se trata de algo completamente diferente, así que, una vez que descubro todo el problema "textIsSelectable", si me puede ayudar o no, si su respuesta funciona, le daré crédito y marcaré como la respuesta a esta pregunta. Siempre doy crédito donde es debido. – Vinay

+0

Oh. Parece que este problema se debe a que no te digo que el método 'isTextSelectable()' es del nivel API '11' (Honeycomb). No estoy seguro si funciona sin. Tendré que probarlo yo mismo. –

3

1) Tome una lista.

2) dividir esta cadena en caracteres separados.

3) tomar setOnItemClickListener (nuevo Evento OnItemClickListener()).

4) muestre Brindis para cada personaje por el dibujo de Charcter.

Te ayudará.

+0

Si la respuesta de Octavian funciona para mí, entonces voy a usar eso (se ajusta mejor a mis necesidades), pero +1 para una forma creativa/diferente de abordar este problema. ;-) – Vinay

9

Si sigue la respuesta aceptada, puede observar que el evento onTouch se produce más de una vez cada vez que el usuario toca la pantalla. Use event.getAction() para averiguar qué acción se está manejando. Esto depende de el comportamiento del usuario que provocó el evento. Por ejemplo, para un simple toque en la pantalla, el evento onTouch se activará 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 hacia adentro, o viceversa). Para obtener más información, consulte MotionEvent.

El siguiente código es una versión modificada de la respuesta aceptada que sólo se encarga de 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; 
    } 
}); 
+0

Upvote de mí. En este punto, ha pasado un tiempo desde que toqué algo relacionado con Android, pero parece tener sentido. :-) – Vinay