Como definir o estilo da fonte para negrito, itálico e sublinhado em um Android TextView?

450

Quero deixar TextViewo conteúdo de um negrito, itálico e sublinhado. Eu tentei o código a seguir e funciona, mas não sublinha.

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

Como eu faço isso? Alguma idéia rápida?

d-man
fonte
funciona para definir apenas um deles?
falstro
sim funcionando bem eu também quero fazê-lo em linha.
que você
6
textView.setPaintFlags (Paint.UNDERLINE_TEXT_FLAG);
BCliks
15
tv.setTypeface(null, Typeface.BOLD_ITALIC);
3
4 maneiras de deixar o Android TextView Negrito Acho que você deveria ler este artigo.
C49

Respostas:

279

Não sei sobre sublinhado, mas para negrito e itálico existe "bolditalic". Não há menção de sublinhado aqui: http://developer.android.com/reference/android/widget/TextView.html#attr_android:textStyle

Lembre-se de que para usar o mencionado bolditalicvocê precisa, e cito essa página

Deve ser um ou mais (separados por '|') dos seguintes valores constantes.

então você usaria bold|italic

Você pode verificar esta pergunta para sublinhar: Posso sublinhar texto em um layout Android?

Nanne
fonte
48
para under line .. textView.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
bCliks
1
A @bala esteja ciente de que sua solução sempre sublinha o texto inteiro, portanto, não é possível nos casos em que alguém deseja sublinhar apenas uma parte dele.
Giulio Piancastelli
362

Isso deve deixar seu TextView em negrito , sublinhado e itálico ao mesmo tempo.

strings.xml

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

Para definir essa String como seu TextView, faça isso em seu 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" />

ou em JAVA ,

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

Às vezes, a abordagem acima não será útil quando você precisar usar o Texto dinâmico. Portanto, nesse caso, o SpannableString entra em ação.

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

RESULTADO

insira a descrição da imagem aqui

Andro Selva
fonte
3
Eu verifiquei em 2.1. Assim, pelo menos ele deve funcionar a partir de 2.1 e acima
Andro Selva
Pode considerar o usonew StyleSpan(Typeface.BOLD_ITALIC)
Cheok Yan Cheng
Por que não funciona na string concatenada dinâmica? É com fio que alguns números apareceu ....
AuBee
152

Ou assim em 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

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

Mantenha-o simples e em uma linha :)


fonte
1
Ao inserir o pacote kotlinx.android.synthetic para a visualização com a qual você está trabalhando, o findViewByID não é necessário no Kotlin, criando cada uma das linhas setTypeface: textViewOne.setTypeface (...)
cren90
é paintFlagsnecessário? Está funcionando sem que
Prabs
75

Para negrito e itálico, o que você está fazendo está correto para sublinhado, use o código a seguir

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>
Vivek
fonte
Para remover o underlinevalor nulo da passagem, em vez do new UnderlineSpan()seguinte content.setSpan(null, 0, content.length(), 0);
Sami Eltamawy
47

Essa é uma maneira fácil de adicionar um sublinhado, mantendo outras configurações:

textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
sonida
fonte
Esteja ciente de que esta solução sempre sublinha o texto inteiro, portanto, não é possível nos casos em que alguém deseja sublinhar apenas uma parte dele.
Giulio Piancastelli
42

Programaticamente:

Você pode fazer programaticamente usando o método setTypeface ():

Abaixo está o código para o Tipo de letra padrão

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

e se você deseja definir um tipo de letra personalizado:

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:

Você pode definir diretamente no arquivo XML como:

android:textStyle="normal"
android:textStyle="normal|bold"
android:textStyle="normal|italic"
android:textStyle="bold"
android:textStyle="bold|italic"
Rei das Massas
fonte
Como posso alterar a família de fontes usando setTypeface também aplica negrito, itálico e sublinhado?
Prince
@DPrince veja aqui stackoverflow.com/questions/12128331/…
King of Masses
23

Se você estiver lendo esse texto de um arquivo ou da rede.

Você pode conseguir isso adicionando tags HTML ao seu texto, como mencionado

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

e, em seguida, você pode usar a classe HTML que processa as seqüências HTML em texto com estilo exibível.

// textString is the String after you retrieve it from the file
textView.setText(Html.fromHtml(textString));
Ahmed Hegazy
fonte
O método fromHtml (String) foi descontinuado no nível 24 da API. Mais discussões aqui: stackoverflow.com/questions/37904739/…
Pavel Biryukov
20

Sem aspas funciona para mim:

<item name="android:textStyle">bold|italic</item>
Lotfi
fonte
5
    style="?android:attr/listSeparatorTextViewStyle
  • ao fazer esse estilo, você pode conseguir sublinhar
dreamdeveloper
fonte
4

Apenas uma linha de código em xml

        android:textStyle="italic"
Boris Ruzanov
fonte
3

Você pode alcançá-lo facilmente usando o Kotlin's buildSpannedString{}sob sua core-ktxdependência.

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

textView.text = formattedString
Morgan Koh
fonte
Esta deve ser a resposta aceita 100%
sachadso