Androidレイアウトでテキストに下線を付けることはできますか?


回答:


1143

これは、やのようなHTMLタグをサポートする文字列リソース xmlファイルを使用している場合に実現できます。<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コードを試してみましたが、機能しませんでした。<u>下線</ u>をプレーンテキストとして表示し続けました
ジョナサン

4
参照:スパンドを返すandroid.text.Html.fromHtml()
Mark Renouf、2011

3
追加ボタンではなく、strings.xmlファイル自体に入力する必要があります。そうでない場合、これは&lt; u&gt;になります。あなたのstrings.xmlファイル内と<U>下線</ U>あなたのコードで
グダ

3
<u>たとえば、カスタムフォントを使用している場合など、タグを介した基盤が機能しない場合があります。ただし、プログラムによる基礎UnderlineSpanはまだ失敗していないので、最も信頼できるソリューションとして推奨します。
Giulio Piancastelli 14

26
エディターには表示されませんが、アプリを起動すると、下線が付きます。
jean d'arme

533

あなたは試すことができます

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

1
マイナーなポイントかもしれませんが、OPはこれをXMLレイアウトファイルで定義することを望んでいました。それ以外の場合、これは優れたソリューションです。
kwishnu 2013

4
クリアしたい場合は、このソリューションを使用しください
ボブズ2013

2
このソリューションはボタンにも使用できます
Rudy Kurniawan

3
カスタムフォントなどを使用する場合は注意が必要| Paint.ANTI_ALIAS_FLAGです。そうしないと、テキストが非常にシャープに見えます。これは、低いAPIで頻繁に発生します。
Martin Marconcini、2018

4
コトリン:textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
Albert Vila Calvo

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>下線&lt; / u>は機能しませんでした。これはAndroid 2.2用です。たぶん、バージョンによって解釈が異なります。
user898763452

@autotravis 2.2用はどれですか?私はそれを古いバージョンでテストしなかったし、異なるバージョンが異なる方法でそれを処理するなら、それはかなり残念です...また、少なくとも現在のドキュメントは、エスケープする必要があると述べています(リンクは答えにあります)。
Ognyan、

私はAndroid 2.3で<u>下線付き</ u>をテストしましたが、動作します。&lt; u>下線&lt; / u>は2.3では機能しません。ドキュメントは、「フォーマット文字列としても使用されるスタイル付きテキストリソースを作成したい場合があります。通常、String.format(String、Object ...)メソッドがすべてのスタイル情報を取り除くため、これは機能しません。文字列から。これの回避策は、エスケープされたエンティティを含むHTMLタグを記述し、フォーマットが行われた後、fromHtml(String)を使用して回復することです。そのため、そのString.format(...)メソッドを介して実行する場合は、エスケープを使用すると思います。
user898763452 '19年

@autotravisはい、あなたは正しいです。String.format(...)で使用します。回答を編集しました。フィードバックをありがとうございます。
Ognyan

2.3および4.1(これまでに試したもののみ)では、getString()、Html.fromHtml()、およびString.format()を使用する代わりに、textView.setText(getText(R.string.text))を使用できます。
Roy Solberg、2012

59

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

3
<sをエスケープするため、Eclipseのヘルパー編集UI内ではなく、実際のXML内で文字列リソースファイルを編集してください。
Chris Rae

51

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

非常にエレガントなソリューション。ありがとうございました!
エイドリアン

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

11

下線付きテキストを描画する最新のアプローチは、メディアでRomain Guy がGitHubで利用可能なソースコードを使用して説明しています。このサンプルアプリケーションは、2つの可能な実装を公開します。

  • APIレベル19を必要とするパスベースの実装
  • APIレベル1を必要とする地域ベースの実装

ここに画像の説明を入力してください


10

私はこれが遅い答えであることを知っていますが、私はかなりうまくいく解決策を思いつきました...コード内のテキストに下線を引くためにAnthony Forloneyから答えを受け取り、それを処理するTextViewのサブクラスを作成しました。次に、下線付きのTextViewが必要なときに、XMLでサブクラスを使用できます。

これが私が作成したクラスです:

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)サポートを追加しますカスタム属性を介してテキストに下線を引いて、上記で指定したように下線を引きます。唯一の違いは、カスタム属性が設定されている場合にのみ下線コードを実行することです。
Justin

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>

これは、カスタムカラーを使用したすべてのビューの下線に最適なソリューションです。ここでは透明な背景を軽視しないでください。android4の場合は必須です。ビューの背景が黒ではない
Ivan

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

EditText、Button、CheckboxなどのTextView子もサポートします

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コードで文字列リソースIDを呼び出します。
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

投票数の多い回答が正しく、最も単純です。ただし、一部のフォントでは機能せず、他のフォントでは機能する場合があります(中国語を処理するときに遭遇した問題です)。

解決策は、TextViewにのみ「WRAP_CONTENT」を使用しないことです。線を描画するための余分なスペースがないためです。TextViewに固定の高さを設定するか、WRAP_CONTENTでandroid:paddingVerticalを使用できます。


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>

xmlファイルのエスケープ記号に注意してください


エスケープシンボルで私のために働いた、ありがとう!
Badr、

1

Kotlinでこれを行うには:

yourTextView.paint?.isUnderlineText = true


0

これに答えるのはかなり遅いですが、テキストを動的に取得したい場合は、Javaコードでこの単純な1行を使用して、機能するものとします。

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

-2

カスタムフォントを使用していて、リソースファイルトリック(<u>Underlined text</u>)で作成された下線が機能するという問題がありましたが、Androidは下線をある種のストライクトラフに変換できました。

私はこの回答を使用して、自分自身でテキストビューの下に境界線を描画しました:https ://stackoverflow.com/a/10732993/664449 。明らかにこれは、部分的に下線が引かれたテキストや複数行のテキストに対しては機能しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.