2011-12-23 11 views
16

Cómo seleccionar una palabra en un toque en TextView/EditText en android. Tengo un texto en un TextView/EditText y cuando el usuario toca una palabra, quiero que se seleccione esa palabra y luego cuando llamo a getSelectedText() como método, debería devolverme la palabra seleccionada. Cualquier ayuda sería apreciada.seleccione una palabra en un toque en TextView/EditText

Mi objetivo es realizar alguna acción cuando el usuario toca una palabra en particular en TextView/EditText.

Respuesta

29

: Otro enfoque mejor es usar BreakIterator:

private void init() { 
    String definition = "Clickable words in text view ".trim(); 
    TextView definitionView = (TextView) findViewById(R.id.text); 
    definitionView.setMovementMethod(LinkMovementMethod.getInstance()); 
    definitionView.setText(definition, BufferType.SPANNABLE); 
    Spannable spans = (Spannable) definitionView.getText(); 
    BreakIterator iterator = BreakIterator.getWordInstance(Locale.US); 
    iterator.setText(definition); 
    int start = iterator.first(); 
    for (int end = iterator.next(); end != BreakIterator.DONE; start = end, end = iterator 
      .next()) { 
     String possibleWord = definition.substring(start, end); 
     if (Character.isLetterOrDigit(possibleWord.charAt(0))) { 
      ClickableSpan clickSpan = getClickableSpan(possibleWord); 
      spans.setSpan(clickSpan, start, end, 
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
     } 
    } 
} 

private ClickableSpan getClickableSpan(final String word) { 
    return new ClickableSpan() { 
     final String mWord; 
     { 
      mWord = word; 
     } 

     @Override 
     public void onClick(View widget) { 
      Log.d("tapped on:", mWord); 
      Toast.makeText(widget.getContext(), mWord, Toast.LENGTH_SHORT) 
        .show(); 
     } 

     public void updateDrawState(TextPaint ds) { 
      super.updateDrawState(ds); 
     } 
    }; 
} 
RESPUESTA

VIEJO

quería manejar haga clic en mi Actividad propia. Lo resolví siguiendo el código:

private void init(){ 
    String definition = "Clickable words in text view ".trim(); 
    TextView definitionView = (TextView) findViewById(R.id.definition); 
    definitionView.setMovementMethod(LinkMovementMethod.getInstance()); 
    definitionView.setText(definition, BufferType.SPANNABLE); 

    Spannable spans = (Spannable) definitionView.getText(); 
    Integer[] indices = getIndices(
      definitionView.getText().toString(), ' '); 
    int start = 0; 
    int end = 0; 
     // to cater last/only word loop will run equal to the length of indices.length 
    for (int i = 0; i <= indices.length; i++) { 
     ClickableSpan clickSpan = getClickableSpan(); 
     // to cater last/only word 
     end = (i < indices.length ? indices[i] : spans.length()); 
     spans.setSpan(clickSpan, start, end, 
       Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
     start = end + 1; 
    } 
} 
private ClickableSpan getClickableSpan(){ 
    return new ClickableSpan() { 
      @Override 
      public void onClick(View widget) { 
       TextView tv = (TextView) widget; 
       String s = tv 
         .getText() 
         .subSequence(tv.getSelectionStart(), 
           tv.getSelectionEnd()).toString(); 
       Log.d("tapped on:", s); 
      } 

      public void updateDrawState(TextPaint ds) { 
       super.updateDrawState(ds); 
      } 
     }; 
} 
public static Integer[] getIndices(String s, char c) { 
    int pos = s.indexOf(c, 0); 
    List<Integer> indices = new ArrayList<Integer>(); 
    while (pos != -1) { 
     indices.add(pos); 
     pos = s.indexOf(c, pos + 1); 
    } 
    return (Integer[]) indices.toArray(new Integer[0]); 
} 
+3

Esta es la mejor respuesta si está buscando la solución de oyentes y no los intentos. No todos los problemas están vinculados con una URL o un esquema. En mi caso, estaba buscando una solución simple para saber qué palabra se tocó en una vista de texto. No hubo una buena solución hasta que vi esto. Esta solución simplemente funciona a la perfección. Hace lo mismo que en lo que se puede hacer clic en la vista de texto, pero la mejor parte es que tenemos el control para tomar medidas relevantes. Hice un cambio sin embargo al código anterior. Con el código anterior, todas las palabras aparecen como enlaces pero no quería eso. Acabo de comentar el super.updateDrawState. –

+0

Muchas gracias estoy trabajando en esto de los últimos 2 días y finalmente lo resuelvo usando su código. Gracias de nuevo. –

+1

Gracias M-WaJeEh. Trabajado como un encanto. Y también le agradezco a Deepak por el poco más que quería. – Manu

0

Use Linkify, use su propia expresión regular para invocar su rutina con el clic de una palabra.

ve aquí para la actualización WikiWord Example and Relevant Blogpost

+0

Excelente. Pero quería manejar el evento de clic a través del oyente, no a través de Intenciones :) –

Cuestiones relacionadas