Можно ли подчеркнуть текст в макете Android?

Как я могу определить подчеркнутый текст в макете Android xml?

Ответ 1

Это может быть достигнуто, если вы используете файл string resource, который поддерживает теги 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);

Ответ 2

Вы можете попробовать с помощью

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

Ответ 3

Три способа подорвать текст в TextView.

SpannableString

setPaintFlags(); в TextView

Html.fromHtml();

1-й подход

Для подрыва текста в TextView вам нужно использовать SpannableString

String udata="Underlined Text";
SpannableString content = new SpannableString(udata);
content.setSpan(new UnderlineSpan(), 0, udata.length(), 0);//where first 0 shows the starting and udata.length() shows the ending span.if you want to span only part of it than you can change these values like 5,8 then it will underline part of it.
mTextView.setText(content);

Второй подход

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

Например,

mTextView.setPaintFlags(mTextView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
mTextView.setText("This text will be underlined");

Вы можете ссылаться на константы класса Paint, если вы хотите нанести удар по тексту.

Третий подход

Использовать Html.fromHtml(htmlString);

String htmlString="<u>This text will be underlined</u>";
mTextView.setText(Html.fromHtml(htmlString));

Ответ 4

"Принимаемый" ответ выше работает НЕ (при попытке использовать строку типа textView.setText(Html.fromHtml(String.format(getString(...), ...))).

Как указано в документах , вы должны скрыть (html-сущность, закодированную) открывающую скобку внутренних тегов &lt;, например. результат должен выглядеть так:

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

Затем в вашем коде вы можете установить текст с помощью:

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

Ответ 5

Содержимое файла Strings.xml:

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

Развертывание файла xml файла с использованием приведенного выше ресурса строки со следующими свойствами textview, как показано ниже:

<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"
    />

Ответ 6

Однострочное решение:

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

Ответ 7

Для Button и TextView это самый простой способ:

Кнопка:

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

Textview:

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

Ответ 8

Однострочное решение

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

Это немного поздно, но может быть полезно для кого-то.

Ответ 9

Самый последний подход к рисованию подчеркнутого текста описан Romain Guy на носителе с доступным исходным кодом на GitHub. В этом примере приложения представлены две возможные реализации:

  • Реализация на основе Path, которая требует уровня API 19
  • Региональная реализация, которая требует уровня API 1

enter image description here

Ответ 10

В Kotlin можно использовать функцию расширения. Это можно использовать только из кода, а не из XML.

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

Использование:

 tv_change_number.underline()
 tv_resend_otp.underline()

Ответ 11

Я знаю, что это поздний ответ, но я придумал решение, которое работает очень хорошо... Я взял ответ от Энтони Форлони для подчеркивания текста в коде и создал подкласс 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, чтобы показать, что мой пример работает с изменением цвета, размера и стиля текста...

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

Ответ 12

проверьте подчеркнутый стиль нажимаемой кнопки:

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

Результат:

enter image description here

Ответ 13

Более чистый способ вместо
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); метод заключается в использовании textView.getPaint().setUnderlineText(true);

И если позже вам потребуется отключить подчеркивание для этого представления, например, в повторно используемом представлении в RecyclerView, textView.getPaint().setUnderlineText(false);

Ответ 14

Просто используйте атрибут в файле строковых ресурсов, например.

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

Ответ 15

Я использовал этот 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>

Ответ 16

Простое и гибкое решение в 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" />

Ответ 17

Блин, проще всего пользоваться

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

Ответ 18

Другое решение заключается в создании пользовательского представления, расширяющего 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"
 />

Ответ 19

попробуйте этот код

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

Удачи!

Ответ 20

  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

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

Ответ 21

Я упростил Самуилу ответ:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--/questions/13742/can-i-underline-text-in-an-android-layout/99245#99245-->
    <item
        android:left="-5dp"
        android:right="-5dp"
        android:top="-5dp">
        <shape>
            <stroke
                android:width="1.5dp"
                android:color="@color/colorAccent" />
        </shape>
    </item>
</layer-list>

Ответ 22

Ответ с наибольшим количеством голосов является правильным и самым простым. Однако иногда вы можете обнаружить, что не работает с одним шрифтом, но работает с другими (с какой проблемой я столкнулся при работе с китайским языком).

Решение заключается в том, чтобы не использовать "WRAP_CONTENT" только для вашего TextView, потому что нет места для рисования линии. Вы можете установить фиксированную высоту для вашего TextView или использовать android: paddingVertical с WRAP_CONTENT.

Ответ 23

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 файле.

Ответ 24

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

Я использовал этот ответ, чтобы нарисовать границу ниже текстового поля: fooobar.com/info/13759/.... Очевидно, что это не работает для частичного подчеркнутого текста или многострочного текста.