Comment définir un texte souligné dans un fichier de disposition xml
sous Android
Cela peut être réalisé si vous utilisez un fichier string resource xml, qui supporte les balises HTML telles que <b></b>
, <i></i>
et <u></u>
.
<resources>
<string name="your_string_here">This is an <u>underline</u>.</string>
</resources>
Si vous voulez souligner quelque chose dans le code, utilisez:
TextView textView = (TextView) view.findViewById(R.id.textview);
SpannableString content = new SpannableString("Content");
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
textView.setText(content);
Vous pouvez essayer avec
textview.setPaintFlags(textview.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
La réponse "acceptée" ci-dessus ne fonctionne PAS (lorsque vous essayez d'utiliser la chaîne telle que textView.setText(Html.fromHtml(String.format(getString(...), ...)))
.
Comme indiqué dans la documentations vous devez échapper le crochet d’ouverture des balises internes (codé en HTML) 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), ...)));
Une solution en ligne:
textview.setPaintFlags(textview.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Contenu du fichier Strings.xml:
<resource>
<string name="my_text">This is an <u>underline</u>.</string>
</resources>
Layout xml file shold utilise la ressource 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 le moyen le plus simple:
Bouton:
button = (Button) view.findViewById(R.id.btton1);
button.setPaintFlags(button.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Affichage:
textView = (Textview) view.findViewById(R.id.textview1);
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Je sais que la réponse est tardive, mais j’ai proposé une solution qui fonctionne assez bien. J'ai repris la réponse d’Anthony Forloney pour souligner le texte dans le code et créer une sous-classe de TextView qui la gère 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 texte soulignée en XML, procédez comme 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 de code 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!
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:
Une façon plus propre au lieu detextView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Méthode consiste à utiliser textView.getPaint().setUnderlineText(true);
Et si vous devez ultérieurement désactiver le soulignement pour cette vue, comme dans une vue réutilisée dans un RecyclerView, textView.getPaint().setUnderlineText(false);
Dans Kotlin fonction d'extension peut être utilisé. Cela ne peut être utilisé qu'à partir de code, pas de xml.
fun TextView.underline() {
paintFlags = paintFlags or Paint.UNDERLINE_TEXT_FLAG
}
Usage:
tv_change_number.underline()
tv_resend_otp.underline()
TextView tv = findViewById(R.id.tv);
tv.setText("some text");
Souligne tout TextView
setUnderLineText(tv, tv.getText().toString());
Souligne une partie de TextView
setUnderLineText(tv, "some");
Prend également en charge les enfants TextView tels que 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);
}
}
}
Utilisez simplement l'attribut dans le fichier de ressources de chaîne, par exemple.
<string name="example"><u>Example</u></string>
J'ai utilisé ce dessin XML pour créer une bordure inférieure et appliqué le dessinable comme arrière-plan à ma vue 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>
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);
À la place, utilisez 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 le 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.
essayez ce code
en XML
<resource>
<string name="my_text"><![CDATA[This is an <u>underline</u>]]></string>
</resources>
dans du code
TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(getString(R.string.my_text)));
Bonne chance!
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" />
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>
La réponse la plus votée est la bonne et la plus simple. Cependant, vous constaterez parfois que cela ne fonctionne pas pour certaines polices mais pour d'autres (quel problème que j'ai rencontré lors de l'utilisation du 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
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 juste ajouter au XML comme indiqué ci-dessous
<yourpackage.UnderLineTextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="underline text"
/>