Чи можу я підкреслити текст у версії Android?


Відповіді:


1144

Це може бути досягнуто, якщо ви використовуєте рядок xml-файлу ресурсу , який підтримує теги HTML, наприклад <b></b>, <i></i>та <u></u>.

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

Якщо ви хочете підкреслити щось із використання коду:

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

49
Привіт, я спробував вищезгаданий код xml ресурсу, і він diddnt працював. він продовжував відображати <u> підкреслення </u> як звичайний текст
Джонатан

4
Дивіться також: android.text.Html.fromHtml (), який повертає Spanned.
Марк Реноф

3
Ви повинні ввести його у самому файлі strings.xml, а не робити це кнопкою додавання. Інакше ви отримаєте це & lt; u & gt; у вашому файлі strings.xml та <u> підкреслити </u> у своєму коді
gdrt

3
У мене траплялися випадки, коли підкреслення <u>тегів не працює, наприклад, іноді, якщо ви використовуєте спеціальний шрифт. Однак програмне забезпечення, що лежить в основі, UnderlineSpanще не має провалу, тому я б рекомендував це як найбільш надійне рішення.
Джуліо Піанкастеллі

26
Він не відображатиметься в редакторі, але коли ви запустите додаток - це буде підкреслено.
jean d'arme

534

Можна спробувати

textview.setPaintFlags(textview.getPaintFlags() |   Paint.UNDERLINE_TEXT_FLAG);

1
Може бути другорядним моментом, але ОП хотів, щоб це було визначено у файлі макета XML; інакше це чудове рішення.
kwishnu

4
використовуйте це рішення, якщо хочете його очистити
Бобс

2
це рішення може бути використане і для кнопки
Руді Курняван

3
Будьте обережні, якщо ви використовуєте власні шрифти чи подібні, можливо, вам також знадобиться | Paint.ANTI_ALIAS_FLAGабо текст буде виглядати дуже гостро. Це проявляється в нижчих API більше, ніж ні.
Мартін Марконніні

4
У Котліні:textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
Альберт Віла Кальво

72

Відповідь "прийнятий" вище НЕ працює (коли ви намагаєтесь використовувати рядок типу textView.setText(Html.fromHtml(String.format(getString(...), ...))).

Як зазначено в документації, ви повинні уникнути (з кодуванням html сутності) відкриваючої дужки внутрішніх тегів &lt;, наприклад результат повинен виглядати так:

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

Потім у своєму коді ви можете встановити текст за допомогою:

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(String.format(getString(R.string.my_string), ...)));

4
<u> тут підкреслено </u> працює чудово. & lt; u> підкреслення </u> не працювало. Це для Android 2.2. Можливо, різні версії трактують це по-різному.
користувач898763452

@autotravis, який для 2,2? Я не тестував його на старих версіях, і це буде дуже прикро, якщо різні версії обробляють це по-різному ... Також принаймні в поточній документації зазначено, що її потрібно уникати (посилання є у відповіді).
Огнян

Я тестував <u> підкреслений </u> на android 2.3, і він працює. & lt; u> підкреслення </u> не працює для 2.3. Документи кажуть: "Іноді ви можете створити текстовий ресурс, який також використовується як рядок формату. Зазвичай це не буде працювати, оскільки метод String.format (String, Object ...) зніме всю інформацію про стиль з рядка. Обхід до цього полягає в тому, щоб написати теги HTML з уникнутими об'єктами, які потім відновлюються зHtml (String) після форматування. " Тож я думаю, що ви б скористалися тим, що виконується, якщо запустити його через метод String.format (...).
користувач898763452

@autotravis так, ви праві. Я використовую його з String.format (...). Я відредагував свою відповідь, дякую за відгуки.
Огнян

На 2.3 і 4.1 (лише ті, які я намагався поки що) ви можете просто використовувати textView.setText (getText (R.string.text)) замість того, щоб використовувати getString (), Html.fromHtml () та String.format ().
Рой Солберг

59

Вміст файлу strings.xml:

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

Макет файлу xml, що використовується, використовує вищевказаний рядок із властивостями перегляду тексту, як показано нижче:

<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:text="@string/my_text"

    android:selectAllOnFocus="false"
    android:linksClickable="false"
    android:autoLink="all"
    />

3
Переконайтесь, що ви редагуєте файл рядкового ресурсу в реальному XML, а не в інтерфейсі помічника, що редагує Eclipse, і він уникне <s.
Кріс Рай

51

Для кнопки та TextView це найпростіший спосіб:

Кнопка:

Button button = (Button) findViewById(R.id.btton1);
button.setPaintFlags(button.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

Перегляд тексту:

TextView textView = (TextView) findViewById(R.id.textview1);
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

Дуже елегантне рішення. Дякую!
Адріан

20

Однорядне рішення

myTextView.setText(Html.fromHtml("<p><u>I am Underlined text</u></p>"));

Це трохи пізно, але може бути корисним для когось.


19

У програмі розширення Kotlin можна використовувати. Це можна використовувати лише з коду, а не з XML.

fun TextView.underline() {
    paintFlags = paintFlags or Paint.UNDERLINE_TEXT_FLAG
}

Використання:

 tv_change_number.underline()
 tv_resend_otp.underline()

13

перегляньте підкреслений стиль кнопки:

<TextView
    android:id="@+id/btn_some_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/btn_add_contact"
    android:textAllCaps="false"
    android:textColor="#57a0d4"
    style="@style/Widget.AppCompat.Button.Borderless.Colored" />

strings.xml:

<string name="btn_add_contact"><u>Add new contact</u></string>

Результат:

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


Зовнішній вигляд Widget.AppCompat.Button.Borderless.Colored набагато краще, ніж підкреслення, однак, як описав @Kiril Vashilo, ви можете це зробити у будь-якому випадку.
xarlymg89

11

Найновіший підхід до малювання підкресленого тексту описаний Романом Гаєм на носії з наявним вихідним кодом на GitHub . Цей зразок програми пропонує дві можливі реалізації:

  • Реалізація на основі шляху, що вимагає рівня API 19
  • Регіональна реалізація, для якої потрібен рівень 1 API

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


10

Я знаю, що це пізня відповідь, але я придумав рішення, яке працює досить добре ... Я взяв відповідь від Ентоні Форлоні за підкреслення тексту в коді та створив підклас TextView, який обробляє це для вас. Тоді ви можете просто використовувати підклас у XML, коли хочете мати підкреслений TextView.

Ось клас, який я створив:

import android.content.Context;
import android.text.Editable;
import android.text.SpannableString;
import android.text.TextWatcher;
import android.text.style.UnderlineSpan;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * Created with IntelliJ IDEA.
 * User: Justin
 * Date: 9/11/13
 * Time: 1:10 AM
 */
public class UnderlineTextView extends TextView
{
    private boolean m_modifyingText = false;

    public UnderlineTextView(Context context)
    {
        super(context);
        init();
    }

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

    public UnderlineTextView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        init();
    }

    private void init()
    {
        addTextChangedListener(new TextWatcher()
        {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after)
            {
                //Do nothing here... we don't care
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count)
            {
                //Do nothing here... we don't care
            }

            @Override
            public void afterTextChanged(Editable s)
            {
                if (m_modifyingText)
                    return;

                underlineText();
            }
        });

        underlineText();
    }

    private void underlineText()
    {
        if (m_modifyingText)
            return;

        m_modifyingText = true;

        SpannableString content = new SpannableString(getText());
        content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
        setText(content);

        m_modifyingText = false;
    }
}

Тепер ... коли ви хочете створити підкреслений перегляд тексту в XML, просто виконайте такі дії:

<com.your.package.name.UnderlineTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:gravity="center"
    android:text="This text is underlined"
    android:textColor="@color/blue_light"
    android:textSize="12sp"
    android:textStyle="italic"/>

У цей фрагмент XML я додав додаткові параметри, щоб показати, що мій приклад працює зі зміною кольору, розміру та стилю тексту ...

Сподіваюся, це допомагає!


2
Хоча цей приклад працює, я швидко зрозумів, що якщо ви хочете мати додатковий контроль у XML, що це просто не буде робити ... Я перейшов на краще рішення, яке передбачає наступні кроки: 1) Перегляд тексту підкласу 2) Додати підтримку підкреслити текст за допомогою спеціальних атрибутів, щоб зробити підкреслення, як зазначено вище. Єдина відмінність полягає в тому, що ви виконуєте код підкреслення лише у тому випадку, якщо встановлений спеціальний атрибут.
Джастін

10

Більш чистий спосіб замість
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); методу - використовувати textView.getPaint().setUnderlineText(true);

Якщо вам потрібно пізніше вимкнути підкреслення цього перегляду, як-от у повторному використанні в RecyclerView, textView.getPaint().setUnderlineText(false);


7

Просто використовуйте атрибут у рядковому файлі ресурсу, наприклад

<string name="example"><u>Example</u></string>

7

Я використовував цей xml-файл для малювання для створення нижньої межі та застосував малюнок як фон до мого перегляду тексту

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle" >
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>

    <item android:top="-5dp" android:right="-5dp" android:left="-5dp">
        <shape>
            <solid android:color="@android:color/transparent" />
            <stroke
                    android:width="1.5dp"
                    android:color="@color/pure_white" />
        </shape>
    </item>
</layer-list>

це ідеальне рішення для всіх підкреслень подання за допомогою спеціального кольору. не поважайте прозорий фон тут, для android 4 це потрібно, ваш погляд матиме чорний фон без нього
Іван Міцура

5

Просте і гнучке рішення у форматі xml:

<View
  android:layout_width="match_parent"
  android:layout_height="3sp"
  android:layout_alignLeft="@+id/your_text_view_need_underline"
  android:layout_alignRight="@+id/your_text_view_need_underline"
  android:layout_below="@+id/your_text_view_need_underline"
  android:background="@color/your_color" />

4

іншим рішенням є створення спеціального перегляду, який розширює TextView, як показано нижче

public class UnderLineTextView extends TextView {

    public UnderLineTextView(Context context) {
        super(context);
        this.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
    }

    public UnderLineTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
    }

}

а просто додайте в xml, як показано нижче

<yourpackage.UnderLineTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="underline text"
 />

Дивовижно !! Але колір підкреслення - сірий, як змінити його на чорний або будь-який інший колір?
OhhhThatVarun

3

Я спростив відповідь Самуїла :

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--https://stackoverflow.com/a/40706098/4726718-->
    <item
        android:left="-5dp"
        android:right="-5dp"
        android:top="-5dp">
        <shape>
            <stroke
                android:width="1.5dp"
                android:color="@color/colorAccent" />
        </shape>
    </item>
</layer-list>

3

Я створив цей метод для зручності

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

Підкресліть цілий TextView

setUnderLineText(tv, tv.getText().toString());

Підкресліть частину TextView

setUnderLineText(tv, "some");

Також підтримуйте TextView таких дітей, як EditText, Button, Checkbox

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


2

спробуйте цей код

в XML

<resource>
 <string name="my_text"><![CDATA[This is an <u>underline</u>]]></string> 
</resources> 

в Кодексі

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(getString(R.string.my_text)));

Щасти!


2
  1. Перейдіть до файлу ресурсів strings.xml
  2. Додайте рядок у файл ресурсу з тегом підкреслення HTML, де це необхідно.

strings.xml HTML підкреслює зразок

  1. Викликайте ідентифікатор рядкового ресурсу у вашому коді Java наступним чином:
sampleTextView.setText(R.string.sample_string);
  1. У висновку повинно бути підкреслене слово "Stackoverflow".

Крім того, наступний код не друкує підкреслення:

String sampleString = getString(R.string.sample_string);
sampleTextView.setText(sampleString);

Натомість використовуйте наступний код, щоб зберегти формат насиченого тексту:

CharSequence sampleString = getText(R.string.sample_string);
sampleTextView.setText(sampleString);

"Ви можете використовувати getString (int) або getText (int) для отримання рядка. GetText (int) зберігає будь-яку стильну форму тексту, застосовану до рядка." Документація на Android.

Зверніться до документації: https://developer.android.com/guide/topics/resources/string-resource.html

Я сподіваюся, що це допомагає.


2

Відповідь у верхній частині є правильною та найпростішою. Однак іноді ви можете виявити, що працюєте не для одних шрифтів, а для інших.

Рішення - не використовувати "WRAP_CONTENT" лише для TextView, оскільки немає зайвого місця для малювання лінії. Ви можете встановити фіксовану висоту TextView або використовувати android: paddingVertical з WRAP_CONTENT.


1
HtmlCompat.fromHtml(
                    String.format(context.getString(R.string.set_target_with_underline)),
                    HtmlCompat.FROM_HTML_MODE_LEGACY)
<string name="set_target_with_underline">&lt;u>Set Target&lt;u> </string>

Зверніть увагу на символ Escape у файлі xml


працював для мене з символами втечі, Спасибі!
Бадр

1

Для цього в Котліні:

yourTextView.paint?.isUnderlineText = true


0

На це відповісти досить пізно, але припустимо, якщо хтось хоче отримати текст динамічно, то він може використовувати цей простий один рядок у своєму коді Java, який працює:

 textView.setText(Html.fromHtml("<p><u>" + get_name + "</u></p>"));

-2

У мене виникла проблема, коли я використовую нестандартний шрифт, і підкреслення, створене за допомогою трюкового файлу ресурсу ( <u>Underlined text</u>), спрацювало, але Android встиг перетворити підкреслення на своєрідне коригування.

Я використовував цю відповідь, щоб намалювати межу під текстовим переглядом: https://stackoverflow.com/a/10732993/664449 . Очевидно, це не працює для частково підкресленого тексту або багатомовного тексту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.