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?


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?


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


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


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>

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

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"

Comment puis-je changer la famille de polices en utilisant setTypeface également appliquer gras, italique, souligné?
Prince


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

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>



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

Cela devrait être la réponse acceptée à 100%
sachadso
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.