Вопрос или проблема
Я хотел бы вставить ссылку в TextView. Однако ссылки не подчеркиваются и не кликабельны.
У меня есть следующий ресурс строки
<string name="info_efficiency_link">
<![CDATA[
• Тепловые насосы - это безусловно самая эффективная технология отопления.<br/><br/>
• Они преобразуют 1 кВтч электроэнергии в 3-4 кВтч тепла.<br/><br/>
• Геотермальные тепловые насосы более эффективны, чем воздушные тепловые насосы, но также и более дорогие.<br/><br/>
• Кстати: Холодильники и морозильники используют процесс, похожий на тепловой насос, перемещая тепло изнутри устройства наружу.<br/><br/>
• Источники: <a href="https://www.entega.de/blog/wirkungsgrad-waermepumpe/">Проф. Дипл. Инг. В. Шенк, Высшая школа Мюнхена, 2020</a> (доступно с 19.10.2024).<br/><br/>
<a href="https://www.techem.de/blog/wirkungsgrad-waermepumpe/">Techem Energy Services GmbH, 2022</a> (доступно с 19.10.2024).<br/><br/>
]]>
</string>
Это файл разметки xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".FR_Options">
<!-- HorizontalScrollView для горизонтального прокручивания -->
<HorizontalScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"> <!-- Обеспечивает использование полной ширины даже если содержимое маленькое -->
<!-- LinearLayout внутри для горизонтального расположения элементов -->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal"> <!-- Установите ориентацию на горизонтальную для прокрутки -->
<!-- Первый элемент: подзаголовок, ImageView и TextView расположены вертикально -->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:padding="10dp">
<!-- Подзаголовок TextView -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/cap_efficiency"
android:textSize="13sp"
android:textStyle="bold" />
<ImageView
android:layout_width="270dp"
android:layout_height="180dp"
android:layout_marginTop="10dp"
android:src="@drawable/facts_efficiency_english" />
<TextView
android:id="@+id/tv_facts_efficiency"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="9dp"
android:autoLink="web"
android:text="@string/info_efficiency_link"
android:linksClickable="true"
android:textColor="@android:color/black" />
</LinearLayout>
</LinearLayout>
</HorizontalScrollView>
</FrameLayout>
Соответствующий TextView — android:id="@+id/tv_facts_efficiency"
. А вот java файл фрагмента
package com.example.game;
import androidx.fragment.app.Fragment;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.core.text.HtmlCompat;
import com.example.game.databinding.FragmentInterestingFactsBinding;
public class FR_InterestingFacts extends Fragment {
private FragmentInterestingFactsBinding binding;
public FR_InterestingFacts() {
// Обязательный пустой конструктор
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Установите ориентацию экрана на ландшафтную
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
binding = FragmentInterestingFactsBinding.inflate(inflater, container, false);
String formattedText = getString(R.string.info_efficiency_link);
binding.tvFactsEfficiency.setText(HtmlCompat.fromHtml(formattedText, HtmlCompat.FROM_HTML_MODE_LEGACY));
binding.tvFactsEfficiency.setMovementMethod(LinkMovementMethod.getInstance());
return binding.getRoot();
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
}
Вы знаете, как решить эту проблему? Ссылки не отображаются, и ничего не происходит, когда вы на них нажимаете. Я пробовал это на двух разных эмуляторах.
Ответ или решение
Проблема с кликабельными ссылками в TextView
на Android
Ваша задача заключается в том, чтобы сделать ссылки, встроенные в TextView
, кликабельными и визуально заметными (например, подчёркнутыми). Давайте рассмотрим детали вашей реализации и шаги для устранения указанной проблемы.
Описание проблемы
Как вы указали, ссылки в TextView
не отображаются должным образом: они не подчёркнуты и не кликабельны. Вы используете ресурс строки, в котором содержится HTML-код с ссылками. Поскольку ссылки не работают, вероятно, это связано с тем, как вы обрабатываете текст и устанавливаете свойства TextView
.
Основные моменты реализации
-
XML-разметка:
- Вы правильно указали атрибуты
android:autoLink="web"
иandroid:linksClickable="true"
. Однако, если текст устанавливается черезsetText()
, это может не сработать должным образом.
- Вы правильно указали атрибуты
-
Код фрагмента:
- Вы используете
HtmlCompat.fromHtml()
, чтобы обрабатывать HTML-контент. Это правильно, и вы также вызываетеsetMovementMethod(LinkMovementMethod.getInstance())
, что позволяет обрабатывать клики по ссылкам.
- Вы используете
Рекомендации по решению
-
Обновление свойства
TextView
:
Убедитесь, что вы правильно обрабатываете HTML. Попробуйте заменить следующий код:String formattedText = getString(R.string.info_efficiency_link); binding.tvFactsEfficiency.setText(HtmlCompat.fromHtml(formattedText, HtmlCompat.FROM_HTML_MODE_LEGACY));
на
String formattedText = getString(R.string.info_efficiency_link); binding.tvFactsEfficiency.setText(Html.fromHtml(formattedText, Html.FROM_HTML_MODE_LEGACY));
Учтите, что
Html.fromHtml()
может использоваться безHtmlCompat
в случаях, когда используется API уровня 24 и выше. Однако, если вы поддерживаете более низкие версии, используйтеHtmlCompat
. -
Добавление стиля для ссылок:
Чтобы ссылки выглядели как подчеркнутые, вы можете добавить следующие атрибуты в вашу разметкуTextView
:android:textColorLink="@color/colorLink" <!-- Здесь замените на ваш цвет --> android:textStyle="normal" <!-- Вы можете экспериментировать с жирным шрифтом, если это необходимо -->
-
Правильное использование
LinkMovementMethod
:
Убедитесь, что методsetMovementMethod
вызывается после задания текстаTextView
. Этот порядок важен для корректного отображения кликабельности ссылок. -
Задайте атрибуты для отображения ссылок:
Убедитесь, что цвет ссылки явно задан в ресурсах цветовой схемы:<color name="colorLink">#0000EE</color> <!-- Например, синий цвет для ссылки -->
-
Проверка тестирования на реальном устройстве:
Иногда эмуляторы могут не показывать поведение, идентичное поведению на реальных устройствах. Попробуйте протестировать ваше приложение на реальном устройстве, чтобы убедиться, что ссылки работают как задумано.
Заключение
Следуя указанным рекомендациям, вы должны устранить проблему отсутствия кликабельности ссылок в TextView
вашего приложения на Android. Убедитесь, что все изменения внесены и протестированы на реальном устройстве для наиболее точного результата. Надеюсь, это поможет вам решить проблему!