Android: запуск активности из интерактивного текста
Есть ли способ запустить операцию из части строки.
например,
У меня это в файле strings.xml:
<string name="clickable_string">This is a <u>clickable string</u></string>
Я хотел бы, чтобы текст между тегами u
был подчеркнутым и запускал действие при щелчке при вставке в TextView
Ответы
Ответ 1
Попробуйте это,
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
присвойте эту строку одному из ваших xml-макетов, а затем в вашем коде получите идентификатор TextView, а затем реализуйте OnClickListener для этого Textview, внутри которого вы можете начать свою новую деятельность, которую хотите.
Ответ 3
Ответ здесь Сделать части текстового кликабельными (не 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;
}
Надеюсь, что это поможет кому-то.