programing

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

nasanasas 2020. 10. 2. 22:32
반응형

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


Android 레이아웃 파일 에서 밑줄이 그어진 텍스트를 어떻게 정의 할 수 xml있습니까?


그것은 당신이 사용하는 경우 달성 할 수 문자열 리소스의 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);

시도 할 수 있습니다.

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

위의 "수락 된"답변은 작동 하지 않습니다 ( 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), ...)));

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

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

한 줄 솔루션

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

조금 늦었지만 누군가에게 유용 할 수 있습니다.


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

  • API 레벨 19가 필요한 경로 기반 구현
  • API 레벨 1이 필요한 지역 기반 구현

여기에 이미지 설명 입력


Kotlin에서 확장 기능을 사용할 수 있습니다. 이것은 xml이 아닌 코드에서만 사용할 수 있습니다.

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

용법:

 tv_change_number.underline()
 tv_resend_otp.underline()

나는 이것이 늦은 대답이라는 것을 알고 있지만 꽤 잘 작동하는 솔루션을 생각해 냈습니다. 코드에서 텍스트에 밑줄을 긋기 위해 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로 밑줄이 그어진 textview를 만들 때마다 다음을 수행하면됩니다.

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

strings.xml :

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

결과:

여기에 이미지 설명 입력


방법 대신 더 깨끗한
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);방법은textView.getPaint().setUnderlineText(true);

나중에 RecyclerView의 재사용 된 뷰에서와 같이 해당 뷰의 밑줄을 해제해야하는 경우 textView.getPaint().setUnderlineText(false);


Just use the attribute in string resource file e.g.

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

I used this xml drawable to create a bottom-border and applied the drawable as the background to my 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>

A simple and flexible solution in 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" />

Damn, it is most simple to use

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

Underline whole TextView

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

Underline some part of TextView

setUnderLineText(tv, "some");

Also support TextView childs like 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);
            }
        }
    }

check my answer here to make clickable underline text or underline multiple parts of TextView


another solution is to a create a custom view that extend TextView as shown below

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

}

and just add to xml as shown below

<yourpackage.UnderLineTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="underline text"
 />

try this code

in XML

<resource>
 <string name="my_text"><![CDATA[This is an <u>underline</u>]]></string> 
</resources> 

in Code

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(getString(R.string.my_text)));

Good Luck!


I simplified Samuel's answer:

<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. Go to strings.xml resource file
  2. Add a string in the resource file with an HTML underline tag where necessary.

strings.xml HTML underline sample

  1. Call the string resource ID in your Java code as following:
sampleTextView.setText(R.string.sample_string);
  1. The output should have the word "Stackoverflow" underlined.

Furthermore, the following code will not print the underline:

String sampleString = getString(R.string.sample_string);
sampleTextView.setText(sampleString);

Instead, use the following code to retain rich text format:

CharSequence sampleString = getText(R.string.sample_string);
sampleTextView.setText(sampleString);

"You can use either getString(int) or getText(int) to retrieve a string. getText(int) retains any rich text styling applied to the string." Android documentation.

Refer to the documentation: https://developer.android.com/guide/topics/resources/string-resource.html

I hope this helps.


The top voted answer is right and simplest. However, sometimes you may find that not working for some font, but working for others.(Which problem I just came across when dealing with Chinese.)

Solution is do not use "WRAP_CONTENT" only for your TextView, cause there is no extra space for drawing the line. You may set fixed height to your TextView, or use android:paddingVertical with WRAP_CONTENT.


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>

Note the Escape symbol in xml file


I had a problem where I'm using a custom font and the underline created with the resource file trick (<u>Underlined text</u>) did work but Android managed to transform the underline to a sort of strike trough.

I used this answer to draw a border below the textview myself: https://stackoverflow.com/a/10732993/664449. Obviously this doesn't work for partial underlined text or multilined text.

참고URL : https://stackoverflow.com/questions/2394935/can-i-underline-text-in-an-android-layout

반응형