Respostas:
Isso pode ser alcançado se você estiver usando um arquivo xml de recurso de sequência , que suporta tags HTML como <b></b>
, <i></i>
e <u></u>
.
<resources>
<string name="your_string_here">This is an <u>underline</u>.</string>
</resources>
Se você quiser sublinhar algo do código, use:
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>
tags subjacentes não funcionam, por exemplo, às vezes, se você estiver usando uma fonte personalizada. No entanto, subjacente programaticamente por UnderlineSpan
ainda não falhou comigo, então eu recomendaria como a solução mais confiável.
Você pode tentar com
textview.setPaintFlags(textview.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
| Paint.ANTI_ALIAS_FLAG
também ou o texto ficará muito nítido. Isso se manifesta em APIs mais baixas com mais frequência do que não.
textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
A resposta "aceita" acima NÃO funciona (quando você tenta usar a string como textView.setText(Html.fromHtml(String.format(getString(...), ...)))
.
Conforme declarado nas documentações, você deve escapar do colchete de abertura (tags codificadas por entidades html) das tags internas com <
, por exemplo, o resultado deve se parecer com:
<resource>
<string name="your_string_here">This is an <u>underline</u>.</string>
</resources>
Em seu código, você pode definir o texto com:
TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(String.format(getString(R.string.my_string), ...)));
Conteúdo do arquivo Strings.xml:
<resource>
<string name="my_text">This is an <u>underline</u>.</string>
</resources>
O arquivo xml de layout deve usar o recurso de string acima com as propriedades abaixo do textview, conforme mostrado abaixo:
<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"
/>
Para Button e TextView, esta é a maneira mais fácil:
Botão:
Button button = (Button) findViewById(R.id.btton1);
button.setPaintFlags(button.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Textview:
TextView textView = (TextView) findViewById(R.id.textview1);
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
confira o estilo de botão clicável sublinhado:
<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>
Resultado:
A abordagem mais recente do desenho de texto sublinhado é descrita por Romain Guy no meio com o código fonte disponível no GitHub . Este aplicativo de exemplo expõe duas implementações possíveis:
Eu sei que essa é uma resposta tardia, mas eu vim com uma solução que funciona muito bem ... Peguei a resposta de Anthony Forloney por sublinhar o texto no código e criei uma subclasse de TextView que lida com isso para você. Em seguida, você pode usar a subclasse em XML sempre que quiser ter um TextView sublinhado.
Aqui está a classe que eu criei:
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;
}
}
Agora ... sempre que você quiser criar uma visualização de texto sublinhada em XML, faça o seguinte:
<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"/>
Adicionei opções adicionais neste snippet XML para mostrar que meu exemplo funciona com a alteração da cor, tamanho e estilo do texto ...
Espero que isto ajude!
Uma maneira mais limpa, em vez do
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
método, é usar
textView.getPaint().setUnderlineText(true);
E se você precisar desativar posteriormente o sublinhado dessa exibição, como em uma exibição reutilizada em um RecyclerView, textView.getPaint().setUnderlineText(false);
Eu usei esse drawable xml para criar uma borda inferior e apliquei o drawable como plano de fundo ao meu textview
<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>
Uma solução simples e flexível em 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" />
Outra solução é criar uma exibição personalizada que estenda o TextView, como mostrado abaixo
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);
}
}
e basta adicionar ao xml como mostrado abaixo
<yourpackage.UnderLineTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="underline text"
/>
Simplifiquei a resposta 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");
Sublinhar todo o TextView
setUnderLineText(tv, tv.getText().toString());
Sublinhe uma parte do TextView
setUnderLineText(tv, "some");
Também suporta childs TextView como 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);
}
}
}
verifique minha resposta aqui para tornar o texto sublinhado clicável ou várias partes do TextView
sampleTextView.setText(R.string.sample_string);
Além disso, o código a seguir não imprimirá o sublinhado:
String sampleString = getString(R.string.sample_string);
sampleTextView.setText(sampleString);
Em vez disso, use o seguinte código para manter o formato rich text:
CharSequence sampleString = getText(R.string.sample_string);
sampleTextView.setText(sampleString);
"Você pode usar getString (int) ou getText (int) para recuperar uma string. GetText (int) mantém qualquer estilo de rich text aplicado à string." Documentação do Android.
Consulte a documentação: https://developer.android.com/guide/topics/resources/string-resource.html
Eu espero que isso ajude.
A resposta mais votada é correta e mais simples. No entanto, às vezes você pode achar que não está funcionando para algumas fontes, mas está funcionando para outras (que problema acabei de encontrar quando lida com chinês).
A solução é não usar "WRAP_CONTENT" apenas para o seu TextView, pois não há espaço extra para desenhar a linha. Você pode definir a altura fixa para o seu TextView ou usar android: paddingVertical com 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>
Observe o símbolo de escape no arquivo xml
Eu tive um problema em que estou usando uma fonte personalizada e o sublinhado criado com o arquivo de recurso trick ( <u>Underlined text</u>
) funcionou, mas o Android conseguiu transformar o sublinhado em uma espécie de greve.
Eu mesmo usei esta resposta para desenhar uma borda abaixo da visualização de texto: https://stackoverflow.com/a/10732993/664449 . Obviamente, isso não funciona para texto parcial sublinhado ou texto multilinhado.