2011-12-23 8 views
16

Come selezionare una parola su un tap in TextView/EditText in Android. Ho un testo in un TextView/EditText e quando l'utente tocca una parola, voglio che quella parola sia selezionata e dopo che chiamo metodo getSelectedText(), dovrebbe restituirmi la parola selezionata. Qualsiasi aiuto sarebbe apprezzato.selezionare una parola a un tocco in TextView/EditText

Il mio obiettivo è eseguire un'azione quando l'utente tocca una determinata parola in TextView/EditText.

risposta

29

UPDATE: Un altro approccio migliore è quello di utilizzare 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); 
     } 
    }; 
} 
RISPOSTA

VECCHIO

Volevo gestire clic nel mio propria attività. Ho risolto il problema con il seguente codice:

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

Questa è la migliore risposta se stai guardando la soluzione degli ascoltatori e non gli intenti. Non tutti i problemi sono collegati con un URL o uno schema. Nel mio caso, stavo cercando una soluzione semplice per sapere quale parola era stata sfruttata in una vista testuale. Non c'era una buona soluzione finché non l'ho visto. Questa soluzione funziona perfettamente. Fa la stessa cosa di ciò che fa clic su TextView, ma la parte migliore è che abbiamo il controllo per intraprendere azioni pertinenti. Ho fatto un cambiamento però al codice di cui sopra. Con il codice sopra, tutte le parole appaiono come collegamenti ma non volevo quello. Quindi ho appena commentato il super.updateDrawState. –

+0

Grazie mille per aver lavorato su questo negli ultimi 2 giorni e alla fine l'ho risolto usando il tuo codice. Grazie ancora. –

+1

Grazie M-WaJeEh. Ha funzionato come un fascino. E grazie anche a Deepak per quel tocco in più che volevo. – Manu

0

Utilizzare Linkify, utilizzare la propria espressione regolare per richiamare la routine con un clic di una parola.

Vedi qui per il WikiWord Example and Relevant Blogpost

+0

Eccellente. Ma volevo gestire l'evento click via listener, non via Intents :) –

Problemi correlati