Comment définir le style de police en gras, en italique et souligné dans un TextView Android?

450

Je veux mettre TextViewle contenu d'un en gras, en italique et souligné. J'ai essayé le code suivant et cela fonctionne, mais ne le souligne pas.

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

Comment fait-on ça? Des idées rapides?

d-man
la source
cela fonctionne-t-il pour n'en définir qu'un seul?
falstro
oui fonctionne bien je veux aussi le faire sous la ligne.
d-man
6
textView.setPaintFlags (Paint.UNDERLINE_TEXT_FLAG);
bCliks
15
tv.setTypeface(null, Typeface.BOLD_ITALIC);
3
4 façons de rendre Android TextView Bold Je pense que vous devriez lire cet article.
c49

Réponses:

279

Je ne connais pas le soulignement, mais pour le gras et l'italique il y en a "bolditalic". Il n'y a aucune mention de soulignement ici: http://developer.android.com/reference/android/widget/TextView.html#attr_android:textStyle

Rappelez-vous que pour utiliser ce dont bolditalicvous avez besoin, je cite cette page

Doit être une ou plusieurs (séparées par '|') des valeurs constantes suivantes.

donc vous utiliseriez bold|italic

Vous pouvez vérifier cette question pour souligner: Puis-je souligner du texte dans une mise en page Android?

Nanne
la source
48
pour sous la ligne .. textView.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
bCliks
1
@bala sachez que votre solution souligne toujours tout le texte, donc ce n'est pas faisable dans les cas où l'on veut en souligner une partie seulement.
Giulio Piancastelli
362

Cela devrait rendre votre TextView gras , souligné et italique en même temps.

strings.xml

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

Pour définir cette chaîne sur votre TextView, faites-le dans votre fichier 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 en JAVA ,

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

Parfois, l'approche ci-dessus ne sera pas utile lorsque vous devrez peut-être utiliser du texte dynamique. Donc, dans ce cas, SpannableString entre en 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);

PRODUCTION

entrez la description de l'image ici

Andro Selva
la source
3
Je l'ai vérifié en 2.1. Donc, au moins, cela devrait fonctionner à partir de 2.1 et au
Andro Selva
Peut envisager d'utilisernew StyleSpan(Typeface.BOLD_ITALIC)
Cheok Yan Cheng
Pourquoi ça ne marche pas sur une chaîne concaténée dynamique? Il est câblé que certains chiffres sont apparus ....
AuBee
152

Ou tout simplement comme ça dans 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 en 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);

Restez simple et en une seule ligne :)


la source
1
En insérant le package kotlinx.android.synthetic pour la vue avec laquelle vous travaillez, le findViewByID n'est pas nécessaire dans Kotlin, ce qui rend chacune des lignes setTypeface: textViewOne.setTypeface (...)
cren90
est paintFlagsnécessaire? Ça marche sans ça
Prabs
75

Pour le gras et l'italique, tout ce que vous faites est correct pour le soulignement, utilisez le code suivant

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
la source
Pour supprimer la underlinevaleur Null du pass au lieu de la new UnderlineSpan()suivante content.setSpan(null, 0, content.length(), 0);
Sami Eltamawy
47

C'est un moyen simple d'ajouter un soulignement, tout en conservant d'autres paramètres:

textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
sonida
la source
Sachez que cette solution souligne toujours tout le texte, donc ce n'est pas faisable dans les cas où l'on veut en souligner seulement une partie.
Giulio Piancastelli
42

Programmation:

Vous pouvez faire par programmation en utilisant la méthode setTypeface ():

Voici le code de la police par défaut

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

et si vous souhaitez définir une police de caractères personnalisée:

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:

Vous pouvez définir directement dans un fichier XML comme:

android:textStyle="normal"
android:textStyle="normal|bold"
android:textStyle="normal|italic"
android:textStyle="bold"
android:textStyle="bold|italic"
Roi des masses
la source
Comment puis-je changer la famille de polices en utilisant setTypeface également appliquer gras, italique, souligné?
Prince
@DPrince regardez ici stackoverflow.com/questions/12128331/…
King of Masses
23

Si vous lisez ce texte à partir d'un fichier ou du réseau.

Vous pouvez y parvenir en ajoutant des balises HTML à votre texte comme mentionné

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

puis vous pouvez utiliser la classe HTML qui traite les chaînes HTML en texte stylisé affichable.

// textString is the String after you retrieve it from the file
textView.setText(Html.fromHtml(textString));
Ahmed Hegazy
la source
La méthode fromHtml (String) a été dépréciée au niveau de l'API 24 Plus de discussion ici: stackoverflow.com/questions/37904739/…
Pavel Biryukov
20

Sans guillemets, ça marche pour moi:

<item name="android:textStyle">bold|italic</item>
Lotfi
la source
5
    style="?android:attr/listSeparatorTextViewStyle
  • en faisant ce style, vous pouvez souligner
développeur de rêve
la source
4

Une seule ligne de code en xml

        android:textStyle="italic"
Boris Ruzanov
la source
3

Vous pouvez y parvenir facilement en utilisant Kotlin buildSpannedString{}sous sa core-ktxdépendance.

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

textView.text = formattedString
Morgan Koh
la source
Cela devrait être la réponse acceptée à 100%
sachadso