Как нажимать или нажимать текст 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, но она не работает в этом сценарии, только один будет изменен на растягиваемую строку.