2010-10-26 12 views
18

Gibt es eine Möglichkeit, ich kann eine Aktivität aus einem Teil einer Zeichenfolge starten.Android: Starten von Aktivität von anklickbarem Text

zB Ich habe dies in meiner strings.xml Datei:

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

ich den Text zwischen den u Tags möchte eine Tätigkeit, die unterstrich und starten, wenn beim Einloggen in ein

Antwort

39

die Sie interessieren,

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()); 

Grundsätzlich haben Sie auf den Bereich von Zeichen ein Span Objekt befestigen Sie klickbare sein wollen. Da Sie ohnehin HTML verwenden, können Sie die von Html.fromSource() gesetzten Unterstreichungsspannen als Markierungen für Ihre eigenen Bereiche verwenden.

Alternativ können Sie auch ein Tag innerhalb der Zeichenfolge definieren, von der Sie nur wissen. , d. H. <activity> Und liefern Sie Ihre eigene Tag-Handler zu der Html.fromSource() -Methode. Auf diese Weise kann Ihre TagHandler-Instanz beispielsweise den markierten Text mit einer bestimmten Farbe umgeben, unterstreichen, fett formatieren und anklickbar machen. Allerdings würde ich den TagHandler-Ansatz nur empfehlen, wenn Sie diese Art von Code häufig schreiben.

+0

Das ist * super *. Eine Sache jedoch, wenn ich den String mit getString abgerufen habe, hat es nicht funktioniert :(. Ich habe gerade den String im Code für den Moment festgeschrieben. Yay. Auch wenn Sie die Linkfarbe auf weiß setzen wollen: textView.setLinkTextColor (android .R.color.white); – tomwilson

+0

Hi Kabal, es funktioniert definitiv unabhängig davon, ob getString() oder getText() verwendet wird.Mit Html.fromSource (String) wird ein spannbares HTML-Markup erstellt, das in Spannen für Androids umgewandelt wird Text-Renderer zu handhaben Pop-up eine Folge-Frage, wenn es ein bestimmtes Problem, mit dem Sie denken, dass Sie damit zu tun haben. –

+0

Hallo, es ist super! Wie kann ich die Zeichenfolge geklickt? Ich habe mehr als String per TextView anklickbar (unterstrichen)? help? – Angie

2
TextView eingefügt geklickt

weisen Sie diese Zeichenfolge einem Ihrer XML-Layout zu und dann in Ihrem Code die ID von TextView und implementieren Sie dann OnClickListener für diese Textansicht, in der Sie Ihre neue Aktivität starten können.

+0

das Problem ist, dass ich möchte nur den Text innerhalb der Tags anklickbar sein. Ich habe das Problem ein wenig vereinfacht, aber das ist eine Voraussetzung. Grundsätzlich möchte ich, dass es sich wie ein HTML-Link-Tag verhält, aber statt einer Webseite startet es eine Aktivität. – Martyn

2

hier beantwortet Make parts of textview clickable (not url) Ich habe gerade eine Modifikation, wenn Sie es mit einer HTML-Nachricht verwenden möchten, gehen Sie wie folgt In Ihrer Anzeigefunktion

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); 
} 

Der modifizierte Funktion von 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; 
    } 

Hoffe, dass das jemandem hilft.

Verwandte Themen