web-dev-qa-db-ja.com

Androidレイアウトのテキストに下線を引くことはできますか?

Androidレイアウトのxmlファイルに underlined textを定義する方法を教えてください。

605
Janusz

<b></b><i></i><u></u>などのHTMLタグをサポートする 文字列resource xmlファイルを使用している場合は、これを実現できます。

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

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

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

上記の "受け入れられた"答えはNOTを働きます(あなたがtextView.setText(Html.fromHtml(String.format(getString(...), ...)))のような文字列を使おうとするとき)。

documentations で述べたように、内部タグの左大括弧を&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), ...)));
62
Ognyan

1行ソリューション

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

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"
    />
49
Devendra Anurag

Buttonと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);
34
awsleiman

ワンラインソリューション

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

少し遅れていますが、誰かに役立つかもしれません。

17
gprathour

下線付きのテキストを描画する最新のアプローチは medium にRomain Guyが記述したもので、 GitHub に利用可能なソースコードがあります。このサンプルアプリケーションは、2つの可能な実装を公開しています。

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

enter image description here

私はこれが遅い答えであることを知っています、しかし私はかなりうまくいく解決策を思いつきました...私はコードのテキストに下線を引くために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スニペットに追加のオプションを追加して、私の例がテキストの色、サイズ、およびスタイルを変更することで機能することを示します。

お役に立てれば!

9
Justin

Kotlinでは 拡張機能 を使うことができます。これはコードからのみ使用でき、xmlからは使用できません。

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

使用法:

 tv_change_number.underline()
 tv_resend_otp.underline()
7
Killer

下線付きのクリック可能なボタンスタイルをチェックしてください。

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

7
jk7

文字列リソースファイルの属性を使用してください。

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

くそー、それは使用するのが最も簡単です

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の複数の部分に下線を付けるには、ここで回答を確認してください

3
Khemraj

このxml drawableを使用して下罫線を作成し、そのdrawableをテキストビューの背景として適用しました

<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コードの文字列リソース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
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

別の解決策は、以下に示すように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"
 />
1
has19

トップ投票の答えは、最も簡単で正しいものです。しかし、あるフォントではうまく動かず、他のフォントではうまく動かないことがあるかもしれません(中国語を扱うときに私が遭遇した問題です)。

解決策はあなたのTextViewだけのために "WRAP_CONTENT"を使わないでください、なぜなら線を引くための余分なスペースがないからです。 TextViewに固定の高さを設定するか、またはWRAP_CONTENTでAndroid:paddingVerticalを使用します。

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>

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

0
lynn8570