Como você sublinha um texto no Android XML?

108

Como você sublinha um texto em um arquivo XML? Não consigo encontrar uma opção em textStyle.

Michael Zeuner
fonte
você tentou usarstyle="text-decoration: underline;"
ρяσѕρєя K
1
você poderia na íntegra como usar isso?
Michael Zeuner,
você tentou fazer issotextView.setText(Html.fromHtml("<u>"+"testest"+"</u>"));
ρяσѕρєя K

Respostas:

174

Se você estiver usando um arquivo xml de recurso de string (suporta tags HTML), isso pode ser feito usando <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 tv = (TextView) view.findViewById(R.id.tv);
SpannableString content = new SpannableString("Content");
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
tv.setText(content);

Espero que isto ajude

George Artemiou
fonte
9
Eu tentei isso. a string não sai sublinhada?
Michael Zeuner
5
Já encontrei casos em que subjacente por meio de <u>tags não funciona, por exemplo, às vezes, se você estiver usando uma fonte personalizada. No entanto, subjacente programaticamente por UnderlineSpanrealmente nunca falhou em mim, então eu o recomendaria como a solução mais confiável.
Giulio Piancastelli,
Você não precisa definir texto em Java. Basta usar <u>e <\u>em XML e é o suficiente.
Maksim Dmitriev
9
no meu caso, a visualização do android studio não foi capaz de determinar a tag html. mas uma vez que executei o projeto no dispositivo real, o texto sublinhado foi mostrado com alegria.
Alvin
1
<whine> o fato de você ter que converter uma string para HTML quando o Google já nos dá negrito / itálico / normal é uma folga, considerando que temos o Android há mais de 5 anos ... </whine>
angryITguy
57

Usa isto:

TextView txt = (TextView) findViewById(R.id.Textview1);
txt.setPaintFlags(txt.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
abh22ishek
fonte
Esteja ciente de que esta solução sempre sublinha todo o texto, portanto, não é viável se quisermos sublinhar apenas uma parte dele. Para isso, você precisa UnderlineSpan.
Giulio Piancastelli,
25
<resource>
    <string name="your_string_here">This is an <u>underline</u>.</string>
</resources>

Se não funcionar, então

<resource>
<string name="your_string_here">This is an &lt;u>underline&lt;/u>.</string>

Porque "<" pode ser uma palavra-chave em algum momento.

E para exibição

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(getString(R.string.your_string_here)));
Bhavin
fonte
3
Isso funciona ... mas se por algum motivo você configurar o TextView para usar o atributo xml android: textAllCaps = "true", o sublinhado não aparecerá. Remova este modificador e o sublinhado aparecerá como pretendido. Apenas um aviso :)
Matt W
5

Em primeiro lugar, vá para o arquivo String.xml

você pode adicionar quaisquer atributos HTML como itálico, negrito ou sublinhado aqui.

    <resources>
        <string name="your_string_here">This is an <u>underline</u>.</string>
    </resources>
Zar E Ahmer
fonte
3

Outra maneira de fazer isso é criar um componente personalizado que estende TextView. É bom para os casos em que você precisa ter vários TextViews sublinhados.

Este é o código do componente:

package com.myapp.components;

import android.content.Context;
import android.support.v7.widget.AppCompatTextView;
import android.text.SpannableString;
import android.text.style.UnderlineSpan;
import android.util.AttributeSet;

public class LinkTextView extends AppCompatTextView {
    public LinkTextView(Context context) {
        this(context, null);
    }

    public LinkTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        SpannableString content = new SpannableString(text);
        content.setSpan(new UnderlineSpan(), 0, content.length(), 0);

        super.setText(content, type);
    }
}

E como usá-lo em xml:

<com.myapp.components.LinkTextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Hello World!" />
Tharkius
fonte
2

Para completar a resposta de Bhavin. Por exemplo, para adicionar sublinhado ou redirecionamento.

((TextView) findViewById(R.id.tv_cgu)).setText(Html.fromHtml(getString(R.string.upload_poi_CGU)));

<string name="upload_poi_CGU"><![CDATA[ J\'accepte les <a href="">conditions générales</a>]]></string>

e você pode saber a tag compatível aqui: http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html

Anthone
fonte
2

Você pode usar a marcação abaixo, mas observe que se você definir o textAllCapspara trueo efeito de sublinhado será removido.

<resource>
    <string name="my_string_value">I am <u>underlined</u>.</string>
</resources>


Nota

Usando textAllCaps com uma string (login_change_settings) que contém marcação; a marcação será eliminada pela conversão de caps

A transformação de texto textAllCaps acabará chamando toString no CharSequence, o que tem o efeito de remover qualquer marcação, como. Esta verificação procura usos de strings contendo marcação que também especifica textAllCaps = true.

Tebo
fonte
2

Existem diferentes maneiras de obter texto sublinhado em um Android TextView.

1. <u>This is my underlined text</u> ou

I just want to underline <u>this</u> word

2. Você pode fazer o mesmo programaticamente.

`textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);`

3. Pode ser feito criando um SpannableString e, em seguida, definindo-o como a propriedade de texto TextView

SpannableString text = new SpannableString("Voglio sottolineare solo questa parola");
text.setSpan(new UnderlineSpan(), 25, 6, 0);
textView.setText(text);
Anandharaj R
fonte
2

Eu usei o método abaixo, funcionou para mim. Abaixo está um exemplo para Button, mas podemos usar em TextView também.

Button btnClickMe = (Button) findViewById(R.id.btn_click_me);
btnClickMe.setPaintFlags(btnClickMe.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Hitesh Dhamshaniya
fonte
1

Se você quiser comparar o texto String ou o texto irá mudar dinamicamente então vocêpoderácriar uma visão no layout de Restrições que irá ajustar de acordo com o comprimento do texto como este

 <android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/txt_Previous"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:layout_marginBottom="8dp"
        android:gravity="center"
        android:text="Last Month Rankings"
        android:textColor="@color/colorBlue"
        android:textSize="15sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <View
        android:layout_width="0dp"
        android:layout_height="0.7dp"
        android:background="@color/colorBlue"
        app:layout_constraintEnd_toEndOf="@+id/txt_Previous"
        app:layout_constraintStart_toStartOf="@+id/txt_Previous"
        app:layout_constraintBottom_toBottomOf="@id/txt_Previous"/>


</android.support.constraint.ConstraintLayout>
MazRoid
fonte
0
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);
            }
        }
    }

Maneira Mais Fácil

TextView tv = findViewById(R.id.tv);
tv.setText("some text");
setUnderLineText(tv, "some");

Também suporta childs TextView como EditText, Button, Checkbox

Se você quiser

- Texto de sublinhado clicável?

- Sublinha várias partes de TextView?

Então verifique esta resposta

Khemraj
fonte