Ссылка в текстовом представлении Android не кликабельна

Вопрос или проблема

Я хотел бы вставить ссылку в TextView. Однако ссылки не подчеркиваются и не кликабельны.

У меня есть следующий ресурс строки

    <string name="info_efficiency_link">
    <![CDATA[
    &#8226; Тепловые насосы - это безусловно самая эффективная технология отопления.<br/><br/>
    &#8226; Они преобразуют 1 кВтч электроэнергии в 3-4 кВтч тепла.<br/><br/>
    &#8226; Геотермальные тепловые насосы более эффективны, чем воздушные тепловые насосы, но также и более дорогие.<br/><br/>
    &#8226; Кстати: Холодильники и морозильники используют процесс, похожий на тепловой насос, перемещая тепло изнутри устройства наружу.<br/><br/>
    &#8226; Источники: <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.

Основные моменты реализации

  1. XML-разметка:

    • Вы правильно указали атрибуты android:autoLink="web" и android:linksClickable="true". Однако, если текст устанавливается через setText(), это может не сработать должным образом.
  2. Код фрагмента:

    • Вы используете HtmlCompat.fromHtml(), чтобы обрабатывать HTML-контент. Это правильно, и вы также вызываете setMovementMethod(LinkMovementMethod.getInstance()), что позволяет обрабатывать клики по ссылкам.

Рекомендации по решению

  1. Обновление свойства 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.

  2. Добавление стиля для ссылок:
    Чтобы ссылки выглядели как подчеркнутые, вы можете добавить следующие атрибуты в вашу разметку TextView:

    android:textColorLink="@color/colorLink"  <!-- Здесь замените на ваш цвет -->
    android:textStyle="normal"  <!-- Вы можете экспериментировать с жирным шрифтом, если это необходимо -->
  3. Правильное использование LinkMovementMethod:
    Убедитесь, что метод setMovementMethod вызывается после задания текста TextView. Этот порядок важен для корректного отображения кликабельности ссылок.

  4. Задайте атрибуты для отображения ссылок:
    Убедитесь, что цвет ссылки явно задан в ресурсах цветовой схемы:

    <color name="colorLink">#0000EE</color> <!-- Например, синий цвет для ссылки -->
  5. Проверка тестирования на реальном устройстве:
    Иногда эмуляторы могут не показывать поведение, идентичное поведению на реальных устройствах. Попробуйте протестировать ваше приложение на реальном устройстве, чтобы убедиться, что ссылки работают как задумано.

Заключение

Следуя указанным рекомендациям, вы должны устранить проблему отсутствия кликабельности ссылок в TextView вашего приложения на Android. Убедитесь, что все изменения внесены и протестированы на реальном устройстве для наиболее точного результата. Надеюсь, это поможет вам решить проблему!

Оцените материал
Добавить комментарий

Капча загружается...