Сделать строку кликабельной, подчеркнутую в TextView

enter image description here

Я хочу сделать строку "эта ссылка" подчеркнутой и кликабельной, но я не знаю, как ее достичь.

XML файл:

<string name="submitText">Before you submit, please check out &lt;u>this link&lt;/u></string>

В моем фрагменте:

tvSubmit.setText(Html.fromHtml(getString(R.string.submitText)));

Я не хочу, чтобы вся строка была нажата, а только подчеркнутый раздел. Я не могу использовать горизонтальный LinearLayout с 2 ячейками, потому что на более мелких устройствах строка не будет продолжать смотреть, она будет разделена на 2 ячейки.

Что я пробовал:

tvSubmit.setMovementMethod(LinkMovementMethod.getInstance());
Spannable sp = (Spannable) tvSubmit.getText();
ClickableSpan click = new ClickableSpan() {
    @Override
    public void onClick(View widget) {
        showLink();
    }
};
sp.setSpan(click, 0, sp.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

В приведенном выше коде подчеркивается целая строка, а цвет текста меняется на голубой.

Ответ 1

проблема заключается в том, что вы устанавливаете span на всю строку (sp.setSpan(click, 0, sp.length()). Чтобы исправить это, вы должны установить только диапазон кликов только на this link. Я сделал то же самое:

<string name="submitText">Before you submit, please check out %1$s</string>
<string name="this_link">this link</string>

в вашей деятельности

String thisLink = getString(R.string.thisLink);
String yourString = getString(R.string.submitText, thisLink);
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(yourString);
spannableStringBuilder.setSpan(click,
                startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

где startIndex и endIndex - это индекс thisLink в yourString. Я разделил две строки, потому что было легче искать индексы, особенно если вам приходится иметь дело с переводами. Чтобы вычислить startIndex, вы можете использовать yourString.indexOf(thisLink), а endIndex - startIndex + the length of thisLink. Я оставлю вам обычные проверки (отрицательные индексы и все остальное, что может вызвать IndexOutBoundException)

Ответ 2

вы можете определить в своих файлах strings.xml

<string name="submitText">Before you submit, please check out <a href="actual url">this link</a>

Ответ 3

 <TextView  
       android:id="@+id/tvSubmit"  
       android:layout_width="wrap_content"  
       android:layout_height="wrap_content"  
       android:layout_alignParentTop="true"  
       android:[email protected]/submitText //link the content of web  
       android:textColorLink="#576586" //change the color of the link  
       android:textColor="#555555" />

в деятельности // образец

String webLinkText = <a href="https://prativas.files.wordpress.com/2013/05/screenshot-mozilla-firefox-private-browsing.png"><img src="https://prativas.files.wordpress.com/2013/05/screenshot-mozilla-firefox-private-browsing.png" alt="Screenshot-Mozilla Firefox (Private Browsing)" width="293" height="254" class="alignnone size-full wp-image-291" /></a>  
 tvSubmit = (TextView) findViewById(R.id.tvSubmit);  
 tvSubmit.setText(Html.fromHtml(webLinkText))); 

проверьте для более подробного ответа

Ответ 4

sp.setSpan(click, 0, sp.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

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

Ответ 5

только что сделал эту функцию, чтобы помочь мне добавить кликабельный текст в textview:

public static SpannableStringBuilder getSpannablableClickFor(CharSequence initialText, ClickableSpan click, String textToAppend) {
    String description = String.format("%s %s", initialText, textToAppend);
    SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(description);
    int start = description.indexOf(textToAppend);
    int end = start + textToAppend.length();
    spannableStringBuilder.setSpan(click,
            start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    spannableStringBuilder.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    spannableStringBuilder.setSpan(new UnderlineSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    final ForegroundColorSpan fcs = new ForegroundColorSpan(Color.WHITE);
    spannableStringBuilder.setSpan(fcs, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    return spannableStringBuilder;
}

Ответ 6

Вы можете попробовать с помощью кода ниже.

String str = "Before you submit, please check out this link";
tvSubmit.setMovementMethod(LinkMovementMethod.getInstance());
tvSubmit.setText(setClickablePart(str), BufferType.SPANNABLE);

Для обработки события Click в текстовом режиме ниже Метод

 private SpannableStringBuilder setClickablePart(String str)
    {
        SpannableStringBuilder m_spannableStringBuilder = new SpannableStringBuilder(str);

        int m_index = str.indexOf("this");

        final String clickString = str.substring(m_index, str.length());
        m_spannableStringBuilder.setSpan(new ClickableSpan()
        {
            @Override
            public void onClick(View widget)
            {
                Toast.makeText(MainActivity.this, clickString, Toast.LENGTH_SHORT).show();
            }
        }, m_index, str.length(), 0);

        return m_spannableStringBuilder;
    }