2010-10-26 11 views
18

Czy istnieje sposób, w jaki mogę uruchomić działanie z fragmentu łańcucha znaków.Android: Rozpocznij aktywność od klikalnego tekstu

np mam to w moim pliku strings.xml:

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

Chciałbym tekst pomiędzy znacznikami u należy podkreślić i rozpocząć działalność po kliknięciu po włożeniu do TextView

Odpowiedz

39

Spróbuj tego,

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

Zasadniczo trzeba dołączyć obiekt Span do zakresu znaków chcesz być klikalne. Ponieważ i tak używasz HTML, możesz użyć podkreślenia rozpiętości umieszczonych przez Html.fromSource() jako znaczników dla własnych przęseł.

Alternatywnie możesz również zdefiniować znacznik w ciągu znaków, który tylko Ty znasz. tj. <activity> Podaj swój własny moduł obsługi znaczników do metody Html.fromSource(). W ten sposób instancja TagHandler może zrobić coś takiego, otaczać zaznaczony tekst określonym kolorem, podkreśleniem, pogrubieniem i sprawić, że będzie można kliknąć. Jednak zalecałbym tylko podejście TagHandler, jeśli często piszesz ten typ kodu.

+0

To jest * niesamowite *. Jedna rzecz jednak, gdybym przyniósł ciąg za pomocą getString to nie działało :(po prostu na stałe zakodowałem ciąg w kodzie na teraz .. yay. Także jeśli chcesz ustawić kolor łącza na biały: textView.setLinkTextColor (android .R.color.white); – tomwilson

+0

Cześć Kabal, to zdecydowanie działa bez względu na użycie getString() lub getText(). Używając Html.fromSource (String) stworzy spannable z html mark up zamieniony w przęsła dla androida Rendering tekstowy do obsługi. Pop-up pytanie uzupełniające, jeśli istnieje konkretny problem, który uważasz, że możesz mieć do czynienia. –

+0

hello to niesamowite !, w jaki sposób mogę uzyskać ciąg kliknięty? Mam więcej niż ciąg klikalny (podkreślony) przez textView? jakiejkolwiek pomocy? – Angie

2

przypisz ten ciąg do jednego z twoich układów xml, a następnie w swoim kodzie uzyskaj identyfikator TextView, a następnie zaimplementuj OnClickListener dla tego Podglądu Tekstów, wewnątrz którego możesz rozpocząć swoją nową aktywność, którą chcesz.

+0

Problem polega na tym, że chcę tylko, aby tekst wewnątrz tagów był klikalny. Uprościłem nieco kwestię, ale jest to wymóg. Zasadniczo chcę, aby działał jak tag linku HTML, ale zamiast strony internetowej uruchamia działanie. – Martyn

2

tu odpowiedzi Make parts of textview clickable (not url) Zrobiłem modyfikację jeśli chcesz używać go z wiadomości HTML wykonaj następujące czynności W funkcji reklamowej

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

Zmodyfikowana funkcja 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; 
    } 

Mam nadzieję, że to pomoże komuś.

Powiązane problemy