Android 레이아웃에서 텍스트에 밑줄을 그을 수 있습니까?


답변:


1144

, 및과 같은 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>을 일반 텍스트로 계속 표시했습니다
Jonathan

4
참고 : android.text.Html.fromHtml ()은 Spanned를 반환합니다.
Mark Renouf

3
add 버튼으로 수행하지 말고 strings.xml 파일 자체에 입력해야합니다. 그렇지 않으면이 & lt; u & gt; strings.xml 파일 및 코드에서 <u> underline </ u>
gdrt

3
<u>태그를 통한 기본 기능 이 작동하지 않는 경우가 있습니다. 예를 들어 사용자 정의 글꼴을 사용하는 경우가 있습니다. 그러나 프로그래밍 방식으로 UnderlineSpan아직 기본적 으로 실패하지 않았으므로 가장 신뢰할 수있는 솔루션으로 권장합니다.
Giulio Piancastelli

26
편집기에는 표시되지 않지만 앱을 시작할 때 밑줄이 표시됩니다.
Jean d' arme

534

당신은 시도 할 수 있습니다

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

1
아마도 사소한 것이지만 OP는 이것을 XML 레이아웃 파일에 정의하기를 원했습니다. 그렇지 않으면 이것은 훌륭한 솔루션입니다.
kwishnu

4
지우려면 이 솔루션을 사용 하십시오
Bobs

2
이 솔루션은 버튼에도 사용할 수 있습니다
Rudy Kurniawan

3
사용자 정의 글꼴이나 이와 유사한 것을 사용하는 경우주의해야합니다. | Paint.ANTI_ALIAS_FLAG그렇지 않으면 텍스트가 매우 선명하게 나타납니다. 이것은 더 낮은 API에서 더 자주 나타납니다.
Martin Marconcini

4
Kotlin에서 :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> underline & lt; / u>가 작동하지 않았습니다. 이것은 안드로이드 2.2입니다. 다른 버전에서는 다르게 해석 할 수 있습니다.
user898763452 1

@ autotravis 어느 것이 2.2입니까? 나는 이전 버전에서 테스트하지 않았으며 다른 버전이 다르게 처리하면 불행히도 될 것입니다 ... 또한 적어도 현재 문서에는 탈출해야한다고 명시되어 있습니다 (링크가 답변에 있습니다).
Ognyan

Android 2.3에서 <u> 밑줄이 그어진 </ u> 테스트했으며 작동합니다. & lt; u> underline & lt; / u>는 2.3에서 작동하지 않습니다. 문서에 "때때로 형식 문자열로도 사용되는 스타일이 지정된 텍스트 리소스를 만들고 싶을 수도 있습니다. 일반적으로 String.format (String, Object ...) 메서드는 모든 스타일 정보를 제거하므로 작동하지 않습니다. 이에 대한 해결 방법은 이스케이프 된 엔터티로 HTML 태그를 작성하고 서식이 지정된 후 fromHtml (String)을 사용하여 복구하는 것입니다. " 따라서 String.format (...) 메소드를 통해 이스케이프를 실행하면 이스케이프를 사용한다고 생각합니다.
user898763452 2014 년

@autotravis 예, 맞습니다. String.format (...)과 함께 사용합니다. 답변을 수정했습니다. 의견을 보내 주셔서 감사합니다.
Ognyan

2.3 및 4.1 (지금까지 시도한 것만)에서는 getString (), Html.fromHtml () 및 String.format ()을 사용하는 대신 textView.setText (getText (R.string.text))를 사용할 수 있습니다.
Roy Solberg

59

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

3
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) findViewById(R.id.textview1);
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

매우 우아한 솔루션. 감사합니다!
Adrian

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>

결과:

여기에 이미지 설명을 입력하십시오


@Kiril Vashilo가 설명했듯이 Widget.AppCompat.Button.Borderless.Colored의 모양과 느낌은 밑줄보다 훨씬 낫습니다. 그러나 어쨌든 할 수 있습니다.
xarlymg89

11

밑줄 친 텍스트를 그리는 가장 최근의 접근 방식은 Romain Guy 가 GitHub 에서 사용 가능한 소스 코드가있는 매체 에 설명되어 있습니다 . 이 샘플 애플리케이션은 두 가지 가능한 구현을 제공합니다.

  • 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) 서브 클래스 textview 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>

이것은 사용자 정의 색상으로 밑줄이 표시된 모든보기에 완벽한 솔루션입니다. 여기에 투명 배경을 무시하지 마십시오, 안드로이드 4 필요합니다, 당신의보기는 검은 배경을 갖지 않습니다
Ivan Mitsura

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)는 문자열에 적용된 서식있는 텍스트 스타일을 유지합니다."안드로이드 문서.

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

코 틀린에서 그렇게하려면 :

yourTextView.paint?.isUnderlineText = true


0

이 답변에 꽤 늦었지만 누군가가 텍스트를 동적으로 가져 오려면 Java 코드 에서이 간단한 한 줄을 사용할 수 있다고 가정합니다.

 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.