Как вы подчеркиваете текст в Android XML?

108

Как вы подчеркиваете текст в XML-файле? Я не могу найти вариант в textStyle.

Майкл Зойнер
источник
u have try usingstyle="text-decoration: underline;"
ρяσѕρєя K
1
не могли бы вы в полной мере, как это использовать?
Michael Zeuner
u have try thistextView.setText(Html.fromHtml("<u>"+"testest"+"</u>"));
ρяσѕρєя K

Ответы:

174

Если вы используете XML-файл строкового ресурса (поддерживает теги HTML), это можно сделать с помощью <b> </b>, <i> </i>и <u> </u>.

<resources>
    <string name="your_string_here">
        This is an <u>underline</u>.
    </string>
</resources>

Если вы хотите что-то подчеркнуть из кода, используйте:

TextView tv = (TextView) view.findViewById(R.id.tv);
SpannableString content = new SpannableString("Content");
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
tv.setText(content);

Надеюсь это поможет

Джордж Артемиу
источник
9
Я пробовал это. строка не подчеркивается?
Майкл Зойнер
5
Я встречал случаи, когда базовые <u>теги не работали, например, иногда, если вы используете собственный шрифт. Тем не менее, программно базовый by UnderlineSpanдействительно никогда не подводил меня, поэтому я бы рекомендовал его как наиболее надежное решение.
Джулио Пьянкастелли
Вам не нужно устанавливать текст на Java. Просто используйте <u>и <\u>в XML, и этого достаточно.
Максим Дмитриев
9
в моем случае предварительный просмотр студии Android не смог определить тег html. но как только я запустил проект на реальном устройстве, подчеркнутый текст был радостно показан.
Элвин
1
<whine> тот факт, что вам нужно преобразовать строку в HTML, когда Google уже выделил нам жирным шрифтом / курсивом / нормальным шрифтом, является довольно слабым, учитывая, что у нас есть Android более 5 лет ... </
whine
57

Использовать это:

TextView txt = (TextView) findViewById(R.id.Textview1);
txt.setPaintFlags(txt.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
abh22ishek
источник
Имейте в виду, что это решение всегда подчеркивает весь текст, поэтому невозможно, если кто-то хочет подчеркнуть только его часть. Для этого вам понадобится UnderlineSpan.
Джулио Пьянкастелли
25
<resource>
    <string name="your_string_here">This is an <u>underline</u>.</string>
</resources>

Если не работает то

<resource>
<string name="your_string_here">This is an &lt;u>underline&lt;/u>.</string>

Потому что "<" когда-то могло быть ключевым словом.

И для отображения

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(getString(R.string.your_string_here)));
Бхавин
источник
3
Это работает ... но если по какой-то причине вы установили TextView для использования атрибута xml android: textAllCaps = "true", подчеркивание не появится. Удалите этот модификатор, и подчеркивание будет отображаться должным образом. Просто хедз-ап :)
Мэтт В.
5

Прежде всего перейдите в файл String.xml

здесь вы можете добавить любые атрибуты HTML, например, курсив, полужирный шрифт или подчеркивание.

    <resources>
        <string name="your_string_here">This is an <u>underline</u>.</string>
    </resources>
AndroidGeek
источник
3

Другой способ сделать это - создать собственный компонент, расширяющий TextView. Это хорошо для случаев, когда вам нужно иметь несколько подчеркнутых TextView.

Вот код компонента:

package com.myapp.components;

import android.content.Context;
import android.support.v7.widget.AppCompatTextView;
import android.text.SpannableString;
import android.text.style.UnderlineSpan;
import android.util.AttributeSet;

public class LinkTextView extends AppCompatTextView {
    public LinkTextView(Context context) {
        this(context, null);
    }

    public LinkTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        SpannableString content = new SpannableString(text);
        content.setSpan(new UnderlineSpan(), 0, content.length(), 0);

        super.setText(content, type);
    }
}

И как использовать в xml:

<com.myapp.components.LinkTextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Hello World!" />
Фаркиус
источник
2

Чтобы завершить ответ Бхавина. Например, чтобы добавить подчеркивание или перенаправление.

((TextView) findViewById(R.id.tv_cgu)).setText(Html.fromHtml(getString(R.string.upload_poi_CGU)));

<string name="upload_poi_CGU"><![CDATA[ J\'accepte les <a href="">conditions générales</a>]]></string>

и вы можете узнать совместимый тег здесь: http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html

Anthone
источник
2

Вы можете использовать разметку ниже, но обратите внимание, что если вы установите textAllCapsдля, trueэффект подчеркивания будет удален.

<resource>
    <string name="my_string_value">I am <u>underlined</u>.</string>
</resources>


Заметка

Использование textAllCaps со строкой (login_change_settings), содержащей разметку; разметка будет сброшена преобразованием заглавных букв

Текстовое преобразование textAllCaps в конечном итоге вызовет toString для CharSequence, что приведет к удалению любой разметки, такой как. Эта проверка ищет случаи использования строк, содержащих разметку, в которой также указано textAllCaps = true.

Тебо
источник
2

Есть разные способы добиться подчеркнутого текста в Android TextView.

1. <u>This is my underlined text</u> или

I just want to underline <u>this</u> word

2. Вы можете сделать то же самое программно.

`textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);`

3.Это можно сделать, создав SpannableString и затем установив его как текстовое свойство TextView.

SpannableString text = new SpannableString("Voglio sottolineare solo questa parola");
text.setSpan(new UnderlineSpan(), 25, 6, 0);
textView.setText(text);
Анандхарадж Р.
источник
2

Я использовал метод ниже, он сработал для меня. Ниже приведен пример для кнопки, но мы также можем использовать его в TextView.

Button btnClickMe = (Button) findViewById(R.id.btn_click_me);
btnClickMe.setPaintFlags(btnClickMe.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Хитеш Дхамшания
источник
1

Если вы хотите сравнить текстовую строку или текст будет динамически изменяться, вы можете создать представление в макете ограничений, оно будет регулироваться в соответствии с длиной текста, как это

 <android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/txt_Previous"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:layout_marginBottom="8dp"
        android:gravity="center"
        android:text="Last Month Rankings"
        android:textColor="@color/colorBlue"
        android:textSize="15sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <View
        android:layout_width="0dp"
        android:layout_height="0.7dp"
        android:background="@color/colorBlue"
        app:layout_constraintEnd_toEndOf="@+id/txt_Previous"
        app:layout_constraintStart_toStartOf="@+id/txt_Previous"
        app:layout_constraintBottom_toBottomOf="@id/txt_Previous"/>


</android.support.constraint.ConstraintLayout>
MazRoid
источник
0
public void setUnderLineText(TextView tv, String textToUnderLine) {
        String tvt = tv.getText().toString();
        int ofe = tvt.indexOf(textToUnderLine, 0);

        UnderlineSpan underlineSpan = new UnderlineSpan();
        SpannableString wordToSpan = new SpannableString(tv.getText());
        for (int ofs = 0; ofs < tvt.length() && ofe != -1; ofs = ofe + 1) {
            ofe = tvt.indexOf(textToUnderLine, ofs);
            if (ofe == -1)
                break;
            else {
                wordToSpan.setSpan(underlineSpan, ofe, ofe + textToUnderLine.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                tv.setText(wordToSpan, TextView.BufferType.SPANNABLE);
            }
        }
    }

Самый простой способ

TextView tv = findViewById(R.id.tv);
tv.setText("some text");
setUnderLineText(tv, "some");

Также поддержите дочерние элементы TextView, такие как EditText, Button, Checkbox.

Если вы хотите

- Подчеркнутый текст с возможностью нажатия?

- Подчеркнуть несколько частей TextView?

Тогда проверьте этот ответ

Хемрадж
источник