2010-10-26 14 views
18

Esiste un modo per avviare un'attività da una parte di una stringa.Android: avvia l'attività dal testo cliccabile

esempio ho questo nel mio file strings.xml:

<string name="clickable_string">This is a <u>clickable string</u></string> 

Vorrei il testo tra i tag u di essere sottolineato e lanciare un'attività quando si fa clic una volta inserito in un TextView

risposta

39

Prova questo,

final Context context = ... // whereever your context is 
CharSequence sequence = Html.fromSource(context.getString(R.string.clickable_string)); 
SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence); 
UnderlineSpan[] underlines = strBuilder.getSpans(UnderlineSpan.class); 
for(UnderlineSpan span : underlines) { 
    int start = strBuilder.getSpanStart(span); 
    int end = strBuilder.getSpanEnd(span); 
    int flags = strBuilder.getSpanFlags(span); 
    ClickableSpan myActivityLauncher = new ClickableSpan() { 
    public void onClick(View view) { 
     context.startActivity(getIntentForActivityToStart()); 
    } 
    }; 

    strBuilder.setSpan(myActivityLauncher, start, end, flags); 
} 

TextView textView = ... 
textView.setText(strBuilder); 
textView.setMovementMethod(LinkMovementMethod.getInstance()); 

In pratica dovete collegare un oggetto Span alla gamma di caratteri che si desidera essere cliccabile. Poiché si utilizza comunque l'HTML, è possibile utilizzare gli intervalli di sottolineatura posizionati da Html.fromSource() come indicatori per i propri intervalli.

In alternativa è anche possibile definire un tag all'interno della stringa che solo tu conosci. <activity> E fornire il proprio gestore di tag al metodo Html.fromSource(). In questo modo l'istanza TagHandler potrebbe fare qualcosa di simile, circondare il testo con tag con un colore specifico, sottolineare, in grassetto e renderlo selezionabile. Tuttavia, raccomanderei solo l'approccio TagHandler se ti ritrovi a scrivere questo tipo di codice molto.

+0

Questo è * fantastico *. Una cosa però, se ho recuperato la stringa usando getString, non ha funzionato :(. Ho solo hardcoded la stringa nel codice per ora .. yay. Inoltre, se si desidera impostare il colore del collegamento al bianco: textView.setLinkTextColor (android .R.color.white); – tomwilson

+0

Ciao Kabal, sicuramente funziona indipendentemente dall'uso di getString() o getText(). Usando Html.fromSource (String) creerà un oggetto espandibile con il markup html trasformato in span per Android rendering di testo da gestire. Fai una domanda di follow-up se c'è un problema specifico che pensi di avere a che fare. –

+0

ciao è fantastico! come posso ottenere la stringa cliccata? ho più di una stringa cliccabile (sottolineata) da textView? qualsiasi aiuto? – Angie

2

assegna questa stringa a uno dei tuoi layout xml e poi nel tuo codice ottieni l'id di TextView e poi implementa OnClickListener per questa Textview, all'interno di esso puoi iniziare la tua nuova attività desiderata.

+0

il problema è che voglio solo che il testo all'interno dei tag sia cliccabile. Ho semplificato il problema un po 'ma questo è un requisito. Fondamentalmente voglio che si comporti come un tag link HTML, ma invece di una pagina web, avvia un'attività. – Martyn

2

risposta qui Make parts of textview clickable (not url) Ho appena fatto una modifica, se si desidera utilizzare con un messaggio HTML effettuare le seguenti operazioni Nella funzione di visualizzazione

public void displayText(String message) { 

      chapterTextView.setText(Html.fromHtml(message),TextView.BufferType.SPANNABLE); 
      chapterTextView.setMovementMethod(LinkMovementMethod.getInstance()); 
      Spannable clickableMessage = (Spannable) chapterTextView.getText(); 
      chapterTextView.setText(addClickablePart(clickableMessage), BufferType.SPANNABLE); 
} 

La funzione modificata del addClickablePart

private SpannableStringBuilder addClickablePart(Spannable charSequence) { 
     SpannableStringBuilder ssb = new SpannableStringBuilder(charSequence); 

     int idx1 = charSequence.toString().indexOf("("); 
     int idx2 = 0; 
     while (idx1 != -1) { 
      idx2 = charSequence.toString().indexOf(")", idx1) + 1; 

      final String clickString = charSequence.toString().substring(idx1, idx2); 
      ssb.setSpan(new ClickableSpan() { 

       @Override 
       public void onClick(View widget) { 
        Toast.makeText(getActivity(), clickString, 
          Toast.LENGTH_SHORT).show(); 
       } 
      }, idx1, idx2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
      idx1 = charSequence.toString().indexOf("(", idx2); 
     } 

     return ssb; 
    } 

Spero che questo aiuti qualcuno.

Problemi correlati