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

Введите описание изображения здесь

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

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); 

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

Проблема заключается в том, что вы устанавливаете 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 )

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

 <string name="submitText">Before you submit, please check out <a href="actual url">this link</a> 
  <TextView android:id="@+id/tvSubmit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:autoLink=@String/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))); 

Уточните здесь, чтобы получить более подробный ответ

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

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

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

 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; } 
Intereting Posts
Приложение Android в nodejs Как реализовать функциональность кнопки «Назад» Android Design Library – Плавающая кнопка для ввода / маржи Зачем использовать связанные (не начатые) услуги в процессе подачи заявки? Анимация в панели уведомлений Пользовательский вид В Android / Gradle, как определить задачу, которая запускается только при создании конкретного buildType / buildVariant / productFlavor (v0.10 +) Android – проблемы с перетаскиванием и обрезкой Android, кнопка «Назад» освобождает память активности? Текстовый текст Android EditText Как использовать Robolectric 2.4 в Android Studio 1.1.0 и gradle 2.2.1 Как открыть список вложений? Почему SQLite для Android может хранить двойное значение (java 8 байт) в столбце float Нарисовать закругленную краевую дугу в андроиде с рельефным эффектом Android ICS: что делает система «Force GPU Rendering» на самом деле? Как решить «Не удалось подключиться» в Google+ для входа в Android?