Réponses:
Cela peut être réalisé si vous utilisez un fichier xml de ressource de chaîne , qui prend en charge les balises HTML comme <b></b>
, <i></i>
et <u></u>
.
<resources>
<string name="your_string_here">This is an <u>underline</u>.</string>
</resources>
Si vous souhaitez souligner quelque chose de l'utilisation du code:
TextView textView = (TextView) view.findViewById(R.id.textview);
SpannableString content = new SpannableString("Content");
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
textView.setText(content);
<u>
balises ne fonctionne pas, par exemple parfois si vous utilisez une police personnalisée. Cependant, le sous-programme par défaut UnderlineSpan
n'a pas encore échoué sur moi, donc je le recommanderais comme la solution la plus fiable.
Vous pouvez essayer avec
textview.setPaintFlags(textview.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
| Paint.ANTI_ALIAS_FLAG
aussi ou votre texte sera très net. Cela se manifeste le plus souvent dans les API inférieures.
textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
La réponse "acceptée" ci-dessus ne fonctionne PAS (lorsque vous essayez d'utiliser la chaîne comme textView.setText(Html.fromHtml(String.format(getString(...), ...)))
.
Comme indiqué dans les documentations, vous devez échapper (parenthèse html encodée) le crochet d'ouverture des balises internes avec <
, par exemple, le résultat devrait ressembler à:
<resource>
<string name="your_string_here">This is an <u>underline</u>.</string>
</resources>
Ensuite, dans votre code, vous pouvez définir le texte avec:
TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(String.format(getString(R.string.my_string), ...)));
Contenu du fichier Strings.xml:
<resource>
<string name="my_text">This is an <u>underline</u>.</string>
</resources>
Le fichier xml de mise en page doit utiliser la ressource de chaîne ci-dessus avec les propriétés ci-dessous de textview, comme indiqué ci-dessous:
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/my_text"
android:selectAllOnFocus="false"
android:linksClickable="false"
android:autoLink="all"
/>
Pour Button et TextView, c'est la manière la plus simple:
Bouton:
Button button = (Button) findViewById(R.id.btton1);
button.setPaintFlags(button.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Affichage:
TextView textView = (TextView) findViewById(R.id.textview1);
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
découvrez le style de bouton cliquable souligné:
<TextView
android:id="@+id/btn_some_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_add_contact"
android:textAllCaps="false"
android:textColor="#57a0d4"
style="@style/Widget.AppCompat.Button.Borderless.Colored" />
strings.xml:
<string name="btn_add_contact"><u>Add new contact</u></string>
Résultat:
L'approche la plus récente de dessiner du texte souligné est décrite par Romain Guy sur support avec le code source disponible sur GitHub . Cet exemple d'application expose deux implémentations possibles:
Je sais que c'est une réponse tardive, mais j'ai trouvé une solution qui fonctionne assez bien ... J'ai pris la réponse d'Anthony Forloney pour souligner le texte dans le code et créé une sous-classe de TextView qui gère cela pour vous. Ensuite, vous pouvez simplement utiliser la sous-classe en XML chaque fois que vous souhaitez avoir un TextView souligné.
Voici la classe que j'ai créée:
import android.content.Context;
import android.text.Editable;
import android.text.SpannableString;
import android.text.TextWatcher;
import android.text.style.UnderlineSpan;
import android.util.AttributeSet;
import android.widget.TextView;
/**
* Created with IntelliJ IDEA.
* User: Justin
* Date: 9/11/13
* Time: 1:10 AM
*/
public class UnderlineTextView extends TextView
{
private boolean m_modifyingText = false;
public UnderlineTextView(Context context)
{
super(context);
init();
}
public UnderlineTextView(Context context, AttributeSet attrs)
{
super(context, attrs);
init();
}
public UnderlineTextView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
init();
}
private void init()
{
addTextChangedListener(new TextWatcher()
{
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{
//Do nothing here... we don't care
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
//Do nothing here... we don't care
}
@Override
public void afterTextChanged(Editable s)
{
if (m_modifyingText)
return;
underlineText();
}
});
underlineText();
}
private void underlineText()
{
if (m_modifyingText)
return;
m_modifyingText = true;
SpannableString content = new SpannableString(getText());
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
setText(content);
m_modifyingText = false;
}
}
Maintenant ... chaque fois que vous voulez créer une vue textuelle soulignée en XML, vous n'avez qu'à faire ce qui suit:
<com.your.package.name.UnderlineTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="center"
android:text="This text is underlined"
android:textColor="@color/blue_light"
android:textSize="12sp"
android:textStyle="italic"/>
J'ai ajouté des options supplémentaires dans cet extrait XML pour montrer que mon exemple fonctionne avec la modification de la couleur, de la taille et du style du texte ...
J'espère que cela t'aides!
Une façon plus propre au lieu de la
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
méthode consiste à utiliser
textView.getPaint().setUnderlineText(true);
Et si vous devez désactiver ultérieurement le soulignement pour cette vue, comme dans une vue réutilisée dans un RecyclerView, textView.getPaint().setUnderlineText(false);
J'ai utilisé ce dessin xml pour créer une bordure inférieure et j'ai appliqué le dessin comme arrière-plan à mon affichage de texte
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle" >
<solid android:color="@android:color/transparent" />
</shape>
</item>
<item android:top="-5dp" android:right="-5dp" android:left="-5dp">
<shape>
<solid android:color="@android:color/transparent" />
<stroke
android:width="1.5dp"
android:color="@color/pure_white" />
</shape>
</item>
</layer-list>
Une solution simple et flexible en xml:
<View
android:layout_width="match_parent"
android:layout_height="3sp"
android:layout_alignLeft="@+id/your_text_view_need_underline"
android:layout_alignRight="@+id/your_text_view_need_underline"
android:layout_below="@+id/your_text_view_need_underline"
android:background="@color/your_color" />
une autre solution consiste à créer une vue personnalisée qui étend TextView comme indiqué ci-dessous
public class UnderLineTextView extends TextView {
public UnderLineTextView(Context context) {
super(context);
this.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
}
public UnderLineTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
this.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
}
}
et ajoutez simplement au xml comme indiqué ci-dessous
<yourpackage.UnderLineTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="underline text"
/>
J'ai simplifié la réponse de Samuel :
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!--https://stackoverflow.com/a/40706098/4726718-->
<item
android:left="-5dp"
android:right="-5dp"
android:top="-5dp">
<shape>
<stroke
android:width="1.5dp"
android:color="@color/colorAccent" />
</shape>
</item>
</layer-list>
TextView tv = findViewById(R.id.tv);
tv.setText("some text");
Souligner TextView entier
setUnderLineText(tv, tv.getText().toString());
Soulignez une partie de TextView
setUnderLineText(tv, "some");
Prend également en charge les enfants TextView comme EditText, Button, Checkbox
public void setUnderLineText(TextView tv, String textToUnderLine) {
String tvt = tv.getText().toString();
int ofe = tvt.indexOf(textToUnderLine, 0);
UnderlineSpan underlineSpan = new UnderlineSpan();
SpannableString wordToSpan = new SpannableString(tv.getText());
for (int ofs = 0; ofs < tvt.length() && ofe != -1; ofs = ofe + 1) {
ofe = tvt.indexOf(textToUnderLine, ofs);
if (ofe == -1)
break;
else {
wordToSpan.setSpan(underlineSpan, ofe, ofe + textToUnderLine.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(wordToSpan, TextView.BufferType.SPANNABLE);
}
}
}
sampleTextView.setText(R.string.sample_string);
De plus, le code suivant n'imprimera pas le soulignement:
String sampleString = getString(R.string.sample_string);
sampleTextView.setText(sampleString);
Utilisez plutôt le code suivant pour conserver le format de texte enrichi:
CharSequence sampleString = getText(R.string.sample_string);
sampleTextView.setText(sampleString);
"Vous pouvez utiliser getString (int) ou getText (int) pour récupérer une chaîne. GetText (int) conserve tout style de texte enrichi appliqué à la chaîne." Documentation Android.
Reportez-vous à la documentation: https://developer.android.com/guide/topics/resources/string-resource.html
J'espère que ça aide.
La réponse la plus votée est juste et la plus simple. Cependant, parfois, vous constaterez que cela ne fonctionne pas pour certaines polices, mais fonctionne pour d'autres (quel problème je viens de rencontrer en traitant le chinois).
La solution est de ne pas utiliser "WRAP_CONTENT" uniquement pour votre TextView, car il n'y a pas d'espace supplémentaire pour tracer la ligne. Vous pouvez définir une hauteur fixe pour votre TextView, ou utiliser android: paddingVertical avec WRAP_CONTENT.
HtmlCompat.fromHtml(
String.format(context.getString(R.string.set_target_with_underline)),
HtmlCompat.FROM_HTML_MODE_LEGACY)
<string name="set_target_with_underline"><u>Set Target<u> </string>
Notez le symbole d'échappement dans le fichier xml
J'ai eu un problème où j'utilise une police personnalisée et le soulignement créé avec le fichier de ressources trick ( <u>Underlined text</u>
) a fonctionné mais Android a réussi à transformer le soulignement en une sorte de creux.
J'ai utilisé cette réponse pour dessiner moi-même une bordure sous la vue de texte: https://stackoverflow.com/a/10732993/664449 . De toute évidence, cela ne fonctionne pas pour le texte souligné partiel ou le texte multiligne.