527

I want to make a TextView's content bold, italic and underlined. I tried the following code and it works, but doesn't underline.

<Textview android:textStyle="bold|italic" ..

How do I do it? Any quick ideas?

Beryllium
  • 12,808
  • 10
  • 56
  • 86
d-man
  • 57,473
  • 85
  • 212
  • 296

12 Answers12

396

This should make your TextView bold, underlined and italic at the same time.

strings.xml

<resources>
    <string name="register"><u><b><i>Copyright</i></b></u></string>
</resources>

To set this String to your TextView, do this in your main.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/textview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:text="@string/register" />

or In JAVA,

TextView textView = new TextView(this);
textView.setText(R.string.register);

Sometimes the above approach will not be helpful when you might have to use Dynamic Text. So in that case SpannableString comes into action.

String tempString="Copyright";
TextView text=(TextView)findViewById(R.id.text);
SpannableString spanString = new SpannableString(tempString);
spanString.setSpan(new UnderlineSpan(), 0, spanString.length(), 0);
spanString.setSpan(new StyleSpan(Typeface.BOLD), 0, spanString.length(), 0);
spanString.setSpan(new StyleSpan(Typeface.ITALIC), 0, spanString.length(), 0);
text.setText(spanString);

OUTPUT

enter image description here

Andro Selva
  • 53,910
  • 52
  • 193
  • 240
305

I don't know about underline, but for bold and italic there is "bolditalic". There is no mention of underline here: http://developer.android.com/reference/android/widget/TextView.html#attr_android:textStyle

Mind you that to use the mentioned bolditalic you need to, and I quote from that page

Must be one or more (separated by '|') of the following constant values.

so you'd use bold|italic

You could check this question for underline: Can I underline text in an android layout?

Community
  • 1
  • 1
Nanne
  • 64,065
  • 16
  • 119
  • 163
177

Or just like this in Kotlin:

val tv = findViewById(R.id.textViewOne) as TextView
tv.setTypeface(null, Typeface.BOLD_ITALIC)
// OR
tv.setTypeface(null, Typeface.BOLD or Typeface.ITALIC)
// OR
tv.setTypeface(null, Typeface.BOLD)
// OR
tv.setTypeface(null, Typeface.ITALIC)
// AND
tv.paintFlags = tv.paintFlags or Paint.UNDERLINE_TEXT_FLAG

Or in Java:

TextView tv = (TextView)findViewById(R.id.textViewOne);
tv.setTypeface(null, Typeface.BOLD_ITALIC);
// OR
tv.setTypeface(null, Typeface.BOLD|Typeface.ITALIC);
// OR
tv.setTypeface(null, Typeface.BOLD);
// OR
tv.setTypeface(null, Typeface.ITALIC);
// AND
tv.setPaintFlags(tv.getPaintFlags()|Paint.UNDERLINE_TEXT_FLAG);

Keep it simple and in one line :)

  • 2
    By inserting the kotlinx.android.synthetic package for the view you are working with, the findViewByID is not necessary in Kotlin, making each of the setTypeface lines: textViewOne.setTypeface(...) – cren90 Dec 11 '17 at 22:50
  • is `paintFlags` necessary ? It's working without that – Prabs Feb 13 '19 at 06:27
85

For bold and italic whatever you are doing is correct for underscore use following code

HelloAndroid.java

 package com.example.helloandroid;

 import android.app.Activity;
 import android.os.Bundle;
 import android.text.SpannableString;
 import android.text.style.UnderlineSpan;
import android.widget.TextView;

public class HelloAndroid extends Activity {
TextView textview;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    textview = (TextView)findViewById(R.id.textview);
    SpannableString content = new SpannableString(getText(R.string.hello));
    content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
    textview.setText(content);
}
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/hello"
android:textStyle="bold|italic"/>

string.xml

<?xml version="1.0" encoding="utf-8"?>
 <resources>
  <string name="hello">Hello World, HelloAndroid!</string>
  <string name="app_name">Hello, Android</string>
</resources>
msrd0
  • 7,816
  • 9
  • 47
  • 82
Vivek
  • 4,170
  • 6
  • 36
  • 50
  • To remove the `underline` pass Null value instead of the `new UnderlineSpan()` as following `content.setSpan(null, 0, content.length(), 0);` – Sami Eltamawy May 17 '15 at 08:54
51

This is an easy way to add an underline, while maintaining other settings:

textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Phil
  • 35,852
  • 23
  • 123
  • 164
sonida
  • 4,411
  • 1
  • 38
  • 40
47

Programmatialy:

You can do programmatically using setTypeface() method:

Below is the code for default Typeface

textView.setTypeface(null, Typeface.NORMAL);      // for Normal Text
textView.setTypeface(null, Typeface.BOLD);        // for Bold only
textView.setTypeface(null, Typeface.ITALIC);      // for Italic
textView.setTypeface(null, Typeface.BOLD_ITALIC); // for Bold and Italic

and if you want to set custom Typeface:

textView.setTypeface(textView.getTypeface(), Typeface.NORMAL);      // for Normal Text
textView.setTypeface(textView.getTypeface(), Typeface.BOLD);        // for Bold only
textView.setTypeface(textView.getTypeface(), Typeface.ITALIC);      // for Italic
textView.setTypeface(textView.getTypeface(), Typeface.BOLD_ITALIC); // for Bold and Italic

XML:

You can set Directly in XML file in like:

android:textStyle="normal"
android:textStyle="normal|bold"
android:textStyle="normal|italic"
android:textStyle="bold"
android:textStyle="bold|italic"
King of Masses
  • 18,405
  • 4
  • 60
  • 77
27

If you are reading that text from a file or from the network.

You can achieve it by adding HTML tags to your text like mentioned

This text is <i>italic</i> and <b>bold</b>
and <u>underlined</u> <b><i><u>bolditalicunderlined</u></b></i>

and then you can use the HTML class that processes HTML strings into displayable styled text.

// textString is the String after you retrieve it from the file
textView.setText(Html.fromHtml(textString));
Ahmed Hegazy
  • 12,395
  • 5
  • 41
  • 64
  • fromHtml(String) method was deprecated in API level 24 More discussion here: https://stackoverflow.com/questions/37904739/html-fromhtml-deprecated-in-android-n – Pavel Biryukov Oct 23 '17 at 09:34
21

Without quotes works for me:

<item name="android:textStyle">bold|italic</item>
Lotfi
  • 211
  • 2
  • 2
13

You can achieve it easily by using Kotlin's buildSpannedString{} under its core-ktx dependency.

val formattedString = buildSpannedString {
    append("Regular")
    bold { append("Bold") }
    italic { append("Italic") }
    underline { append("Underline") }
    bold { italic {append("Bold Italic")} }
}

textView.text = formattedString
Morgan Koh
  • 2,297
  • 24
  • 24
12

Just one line of code in xml

        android:textStyle="italic"
Bo Z
  • 2,359
  • 1
  • 13
  • 31
5
    style="?android:attr/listSeparatorTextViewStyle
  • by making this style, u can achieve underlining
dreamdeveloper
  • 1,266
  • 1
  • 15
  • 20
0

The community answer and the answer by Vivek have introduced the SpannableString class. This works, but what if you want more flexibility to build the string piece by piece, with different styles/effects in each piece, in StringBuilder style?

Is there something like StringBuilder for spannable strings? It turns out there is. Morgan Koh's answer explains it for Kotlin. In Java, we can do it too, something like

  SpannableStringBuilder myString = new SpannableStringBuilder().append("this in bold",boldSpan,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  myString.append("\n\nThis line in regular text\n\n");
auspicious99
  • 3,902
  • 1
  • 44
  • 58