Android: запуск активности из кликабельного текста

Есть ли способ запустить действие из части строки.

например, у меня есть это в моем файле strings.xml:

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

Я хотел бы, чтобы текст между тегами u был подчеркнут и запускал действие при нажатии при вставке в TextView


person Martyn    schedule 26.10.2010    source источник


Ответы (3)


Попробуй это,

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

По сути, вам нужно прикрепить объект Span к диапазону символов, которые вы хотите активировать. Поскольку вы все равно используете HTML, вы можете использовать подчеркивание, размещенное с помощью Html.fromSource(), в качестве маркеров для ваших собственных интервалов.

В качестве альтернативы вы также можете определить тег в строке, о которой знаете только вы. то есть <activity> И укажите свой собственный обработчик тегов для метода Html.fromSource(). Таким образом, ваш экземпляр TagHandler может сделать что-то вроде окружения помеченного текста определенным цветом, подчеркивания, жирного шрифта и сделать его интерактивным. Однако я бы рекомендовал подход TagHandler только в том случае, если вы часто пишете код такого типа.

person Greg Giacovelli    schedule 26.10.2010
comment
Это потрясающе. Одна вещь, хотя, если я получил строку с помощью getString, это не сработало :(. Я просто жестко закодировал строку в коде на данный момент.. yay. Также, если вы хотите установить белый цвет ссылки: textView.setLinkTextColor(android .R.цвет.белый); - person tomwilson; 17.08.2011
comment
Привет, Кабал, это определенно работает независимо от использования getString() или getText(). Используя Html.fromSource(String), он создаст spannable с разметкой html, превращенной в диапазоны для обработки текстового рендерера Android. Задайте дополнительный вопрос, если есть конкретная проблема, с которой вы, возможно, имеете дело. - person Greg Giacovelli; 18.08.2011
comment
привет это круто! как я могу щелкнуть строку? у меня есть более чем строка, которую можно щелкнуть (подчеркнуто) с помощью textView? любая помощь? - person Angie; 03.04.2012
comment
Вы можете создать ClickableSpan и связать его с символами в строке, которую вы хотите щелкнуть. Подобно решению UnderlineSpan выше. - person Greg Giacovelli; 04.04.2012

назначьте эту строку одному из ваших макетов xml, а затем в своем коде получите идентификатор TextView, а затем реализуйте OnClickListener для этого Textview, внутри него вы можете начать свою новую активность, которую вы хотите.

person Senthil Mg    schedule 26.10.2010
comment
проблема в том, что я хочу, чтобы текст внутри тегов был кликабельным. Я немного упростил вопрос, но это требование. По сути, я хочу, чтобы он действовал как тег ссылки HTML, но вместо веб-страницы запускал действие. - person Martyn; 26.10.2010

Ответил здесь Сделать части текстового просмотра интерактивными (не URL) Я только что сделал модификацию, если вы хотите использовать ее с HTML-сообщением, выполните следующие действия. В вашей функции отображения

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

Модифицированная функция 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;
    }

Надеюсь, это поможет кому-то.

person Bahaa Hany    schedule 04.08.2014