it-swarm.com.ru

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

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

583
Janusz

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

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

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

«Принятый» ответ выше НЕ работает (когда вы пытаетесь использовать строку типа 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), ...)));
61
Ognyan

Одноканальное решение:

textview.setPaintFlags(textview.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
55
Jiju Induchoodan

Содержимое файла 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"
    />
48
Devendra Anurag

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

Кнопка: 

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

TextView: 

textView = (Textview) view.findViewById(R.id.textview1);
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
31
awsleiman

Решение одной линии

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

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

17
gprathour

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

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

9
Justin

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

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

 enter image description here

7
Volodymyr Khodonovych

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

<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

7
Kirill Vashilo

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

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

6
jk7

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

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

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

 tv_change_number.underline()
 tv_resend_otp.underline()
4
Killer

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

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

3
Khemraj

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

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

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

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

в 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
Andrew.J

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

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

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

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

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

0
Ray Lee
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

0
lynn8570

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