How do you underline a text in Android XML?
Asked Answered
F

11

145

How do you underline a text in an XML file? I can't find an option in textStyle.

Fernandafernande answered 4/4, 2012 at 20:47 Comment(3)
u have try using style="text-decoration: underline;"Fabyola
could you should in full how to use that?Fernandafernande
u have try this textView.setText(Html.fromHtml("<u>"+"testest"+"</u>"));Fabyola
R
222

If you are using a string resource xml file (supports HTML tags), it can be done using<b> </b>, <i> </i> and <u> </u>.

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

If you want to underline something from code use:

TextView tv = (TextView) view.findViewById(R.id.tv);
SpannableString content = new SpannableString("Content");
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
tv.setText(content);
Rogelioroger answered 4/4, 2012 at 20:55 Comment(6)
I tryed this. the string does not come up underlined?Fernandafernande
I have come across cases when underlying through <u> tags does not work, e.g. sometimes if you are using a custom font. However, underlying programmatically by UnderlineSpan has indeed never failed on me, so I would recommend it as the most reliable solution.Rocketry
You don't need to set text in Java. Just use <u> and <\u> in XML, and it's enough.Deprecate
in my case, android studio preview was not able to determine the html tag. but once i ran the project in real device, underlined text shown happily.Emelia
<whine>the fact that you have to convert a string to HTML when Google already gives us bold/italic/normal is a pretty slack considering we've had Android for over 5 years...</whine>Membranophone
I'm getting the underline starting in the space before the word... <string name="not_registered">Not Registered? Click <u>here</u> to register!"</string> Anyone know why? The underline is starting in the space immediately after the "k" in "Click".Bankroll
E
74

Use this:

TextView txt = (TextView) findViewById(R.id.Textview1);
txt.setPaintFlags(txt.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Eisteddfod answered 27/12, 2013 at 5:13 Comment(2)
Be aware that this solution always underlines the whole text, so it's not feasible if one wants to underline only a portion of it. For that, you need UnderlineSpan.Rocketry
Need help how to write the second line of this answer in Kotlin? It throws compile time error at the | character. I'm not aware of the syntax of including this character.Bottali
C
27
<resource>
    <string name="your_string_here">This is an <u>underline</u>.</string>
</resources>

If it does not work then

<resource>
<string name="your_string_here">This is an &lt;u>underline&lt;/u>.</string>

Because "<" could be a keyword at some time.

And for Displaying

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(getString(R.string.your_string_here)));
Corm answered 5/4, 2012 at 7:6 Comment(1)
This works...but if for some reason you set the TextView to use the xml attribute android:textAllCaps="true", the underline will not appear. Remove this modifier and the underline will show as intended. Just a heads up :)Minter
N
15

First of all, go to String.xml file

you can add any HTML attributes like , italic or bold or underline here.

    <resources>
        <string name="your_string_here">This is an <u>underline</u>.</string>
    </resources>
Nihility answered 21/4, 2014 at 11:28 Comment(0)
S
5

I used below method, it worked for me. Below is example for Button but we can use in TextView as well.

Button btnClickMe = (Button) findViewById(R.id.btn_click_me);
btnClickMe.setPaintFlags(btnClickMe.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Soy answered 7/11, 2016 at 6:28 Comment(0)
S
5

Another way to do it, is creating a custom component extending TextView. It's good for cases where you need to have multiple underlined TextViews.

Here's the code for the component:

package com.myapp.components;

import android.content.Context;
import android.support.v7.widget.AppCompatTextView;
import android.text.SpannableString;
import android.text.style.UnderlineSpan;
import android.util.AttributeSet;

public class LinkTextView extends AppCompatTextView {
    public LinkTextView(Context context) {
        this(context, null);
    }

    public LinkTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        SpannableString content = new SpannableString(text);
        content.setSpan(new UnderlineSpan(), 0, content.length(), 0);

        super.setText(content, type);
    }
}

And how to use it in xml:

<com.myapp.components.LinkTextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Hello World!" />
Sedentary answered 11/1, 2018 at 12:44 Comment(1)
I would strongly suggest to use this approach compared to the answers using string resources. My main concern is that string resources combined with styling mixes design with content. If your application supports multiple languages you'll have to include the styling in every internationalization. Very easy accidentally delete styling when copy pasting the translations.Victorinavictorine
R
4

You can use the markup below, but note that if you set the textAllCaps to true the underline effect would be removed.

<resource>
    <string name="my_string_value">I am <u>underlined</u>.</string>
</resources>


Note

Using textAllCaps with a string (login_change_settings) that contains markup; the markup will be dropped by the caps conversion

The textAllCaps text transform will end up calling toString on the CharSequence, which has the net effect of removing any markup such as . This check looks for usages of strings containing markup that also specify textAllCaps=true.

Rector answered 4/11, 2017 at 12:44 Comment(0)
S
4

Create a String resource:

<string name="HEADER_DELTA"><b><u>DELTA</u></b></string>

and add to your Textview

    <TextView
        android:id="@+id/txtDeltaText"
        style="@style/Default_TextBox_Small"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:gravity="center_horizontal"
        android:text="@string/HEADER_DELTA"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/txtActualMetric"
        app:layout_constraintTop_toBottomOf="@+id/txtMetricName" />
Sexivalent answered 7/2, 2021 at 17:51 Comment(0)
G
3

There are different ways to achieve underlined text in an Android TextView.

1.<u>This is my underlined text</u> or

I just want to underline <u>this</u> word

2.You can do the same programmatically.

`textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);`

3.It can be done by creating a SpannableString and then setting it as the TextView text property

SpannableString text = new SpannableString("Voglio sottolineare solo questa parola");
text.setSpan(new UnderlineSpan(), 25, 6, 0);
textView.setText(text);
Gold answered 27/8, 2018 at 7:7 Comment(0)
H
2

To complete Bhavin answer. For exemple, to add underline or redirection.

((TextView) findViewById(R.id.tv_cgu)).setText(Html.fromHtml(getString(R.string.upload_poi_CGU)));

<string name="upload_poi_CGU"><![CDATA[ J\'accepte les <a href="">conditions générales</a>]]></string>

and you can know compatible tag here : http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html

Histolysis answered 11/6, 2014 at 14:29 Comment(0)
L
1

If you want to compare text String or the text will change dynamically then you can created a view in Constraint layout it will adjust according to text length like this

 <android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/txt_Previous"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:layout_marginBottom="8dp"
        android:gravity="center"
        android:text="Last Month Rankings"
        android:textColor="@color/colorBlue"
        android:textSize="15sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <View
        android:layout_width="0dp"
        android:layout_height="0.7dp"
        android:background="@color/colorBlue"
        app:layout_constraintEnd_toEndOf="@+id/txt_Previous"
        app:layout_constraintStart_toStartOf="@+id/txt_Previous"
        app:layout_constraintBottom_toBottomOf="@id/txt_Previous"/>


</android.support.constraint.ConstraintLayout>
Lawana answered 4/9, 2019 at 6:51 Comment(1)
I have no idea how this answer relates to the question. OP didn't mention comparing texts at all and there's nothing in your answer about underlines.Victorinavictorine

© 2022 - 2024 — McMap. All rights reserved.