Android: запуск активности из кликабельного текста - PullRequest
21 голосов
/ 26 октября 2010

Есть ли какой-нибудь способ, которым я могу запустить действие из части строки.

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

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

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

Ответы [ 3 ]

40 голосов
/ 26 октября 2010

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

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, если вы часто пишете этот тип кода.

2 голосов
/ 05 августа 2014

Отвечено здесь Сделать части текстового просмотра активируемыми (не 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;
    }

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

2 голосов
/ 26 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...