Как нажимать или нажимать текст TextView на разные слова?
Как перейти к другому представлению, щелкнув текстовое представление двумя разными словами.
это строка, которую я использую.
By clicking Sign Up, you are indicating that you have read and agree to the
Term of Use and Privacy Policy.
Я хочу сделать эти два слова (срок использования, политика конфиденциальности) разным цветом и кликабельными.
Я знаю ho, чтобы сделать цвет для определенного слова. я хочу сделать его кликабельным.
Ответы
Ответ 1
Наконец-то я понял, как иметь несколько кликабельных частей в TextView.
Важно, чтобы все они имели свой собственный ClickableSpan! Вот где я ошибся, впервые проверив это. Если они имеют один и тот же экземпляр ClickableSpan, запоминается только последний заданный диапазон.
Я создал строку с требуемой зоной, окруженной "[" и "]".
String sentence = "this is [part 1] and [here another] and [another one]";
и вот набор TextView, setMovementMehthod также является обязательным:
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(addClickablePart(sentence), BufferType.SPANNABLE);
Я создал эту функцию, которая будет обрабатывать создание интерактивной области:
private SpannableStringBuilder addClickablePart(String str) {
SpannableStringBuilder ssb = new SpannableStringBuilder(str);
int idx1 = str.indexOf("[");
int idx2 = 0;
while (idx1 != -1) {
idx2 = str.indexOf("]", idx1) + 1;
final String clickString = str.substring(idx1, idx2);
ssb.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(getView().getContext(), clickString,
Toast.LENGTH_SHORT).show();
}
}, idx1, idx2, 0);
idx1 = str.indexOf("[", idx2);
}
return ssb;
}
Ответ 2
Основываясь на ответе мальчика (и спасибо за ваш ответ, который очень помог мне), вот еще один способ, которым я реализовал его без этих символов ['и'], используя внутренний класс для описания интерактивных слов:
import java.util.List;
import android.content.Context;
import android.text.SpannableStringBuilder;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.util.AttributeSet;
import android.widget.TextView;
/**
* Defines a TextView widget where user can click on different words to see different actions
*
*/
public class ClickableTextView extends TextView {
public ClickableTextView(Context context) {
super(context);
}
public ClickableTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ClickableTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setTextWithClickableWords(String text, List<ClickableWord> clickableWords) {
setMovementMethod(LinkMovementMethod.getInstance());
setText(addClickablePart(text, clickableWords), BufferType.SPANNABLE);
}
private SpannableStringBuilder addClickablePart(String str, List<ClickableWord> clickableWords) {
SpannableStringBuilder ssb = new SpannableStringBuilder(str);
for (ClickableWord clickableWord : clickableWords) {
int idx1 = str.indexOf(clickableWord.getWord());
int idx2 = 0;
while (idx1 != -1) {
idx2 = idx1 + clickableWord.getWord().length();
ssb.setSpan(clickableWord.getClickableSpan(), idx1, idx2, 0);
idx1 = str.indexOf(clickableWord.getWord(), idx2);
}
}
return ssb;
}
public static class ClickableWord {
private String word;
private ClickableSpan clickableSpan;
public ClickableWord(String word, ClickableSpan clickableSpan) {
this.word = word;
this.clickableSpan = clickableSpan;
}
/**
* @return the word
*/
public String getWord() {
return word;
}
/**
* @return the clickableSpan
*/
public ClickableSpan getClickableSpan() {
return clickableSpan;
}
}
}
Надеюсь, это поможет кому-то
EDIT: как изменить цвет ссылки и удалить подчеркивание:
Создайте и используйте собственную реализацию ClickableSpan следующим образом:
//a version of ClickableSpan without the underline
public static class NoUnderlineClickableSpan extends ClickableSpan {
private int color = -1;
public void setColor(int color) {
this.color = color;
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false);
if (this.color != -1) {
ds.setColor(this.color);
}
}
}
Ответ 3
Намного проще использовать HTML со ссылками в TextView, чем создавать несколько TextView, заботясь о макете, слушателях и т.д.
В вашей деятельности или фрагменте:
TextView mText = (TextView) findViewById(R.id.text_linkified);
mText.setText(Html.fromHtml("Open <a href='myapp://my-activity'>My Activity</a> or" +
" <a href='myapp://other-activity'>Other Activity</a>"));
mText.setMovementMethod(LinkMovementMethod.getInstance());
В манифесте
<activity android:name=".MyActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="myapp" android:host="my-activity"/>
</intent-filter>
</activity>
<activity android:name=".MyOtherActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="myapp" android:host="other-activity" />
</intent-filter>
</activity>
Ответ 4
Я рекомендую эту библиотеку: https://github.com/klinker24/Android-TextView-LinkBuilder
это соответствует вашему требованию очень хорошо.
Краткий обзор:
![enter image description here]()
скопированный файл проекта readme:
- Укажите длинные и короткие действия для определенного слова в вашем TextView
- Предоставьте пользователю обратную связь, выделив текст, когда пользователь коснется его
Сопоставьте отдельные строки или используйте регулярное выражение для установки интерактивных ссылок на любой текст, соответствующий этому шаблону.
- Изменить цвет связанного текста
- Измените прозрачность выделения текста, когда пользователь коснется его.
- Укажите, хотите ли вы подчеркнуть текст
Основное преимущество использования этой библиотеки над функциональностью Autolink TextView заключается в том, что вы можете связать что угодно, а не только веб-адрес, электронные письма и номера телефонов. Он также обеспечивает настройку цвета и сенсорную обратную связь.
Ответ 5
В реализации ClickableTextView, что произойдет, если строка получила слово с повторением?
предположим, например, что строка "Я кликабельна, а также это доступно для клика", то обе строки должны быть изменены на строку Spannable, но она не работает в этом сценарии, только один будет изменен на растягиваемую строку.