Могу ли я подчеркнуть текст в макете android?

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

20 ответов


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

С

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

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

как говорится в документация вы должны избежать (HTML entity encoded) открытие скобки внутренних тегов с &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), ...)));

решение одной строки:

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

строки.содержимое XML-файла:

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

макет xml-файла shold используйте вышеуказанный строковый ресурс с нижеприведенными свойствами 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"
    />

для кнопки и 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);

одна линия решение

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

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


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

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

надеюсь, что это помогает!


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

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

строки.XML-код:

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

результат:

enter image description here


самый последний подход рисования подчеркнутым текстом описан Ромэном Гаем на средний С доступным исходным кодом на GitHub. Этот пример приложения предоставляет две возможные реализации:

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

enter image description here


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

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


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

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

черт, это самый простой в использовании

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

подчеркните весь TextView

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

подчеркните некоторую часть TextView

setUnderLineText(tv, "some");

также поддерживает TextView детей, как EditText, кнопка, флажок

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


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

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

Удачи!


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

я использовал этот xml drawable для создания нижней границы и применил drawable в качестве фона к моему textview

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

  1. перейдите к строкам.xml-файл ресурсов
  2. при необходимости добавьте строку в файл ресурсов с тегом подчеркивания HTML.

строки.образец подчеркивания 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

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


я упростил Самуил'ы ответ:

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

для пользователей Kotlin: Это не позволит вам подчеркнуть текст в xml. Однако функция расширения поможет вам.

val TextView.underline: Unit
get() {
    this.paintFlags = this.getPaintFlags() or Paint.UNDERLINE_TEXT_FLAG
}

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

 tv_change_number.underline
 tv_resend_otp.underline

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

я использовал этот ответ, чтобы нарисовать границу под textview сам:https://stackoverflow.com/a/10732993/664449. Очевидно, что это не работает для частичного подчеркнутого текста или многолинейного текста.