¿Cómo se subraya un texto en XML de Android?

108

¿Cómo se subraya un texto en un archivo XML? No puedo encontrar una opción en textStyle.

Michael Zeuner
fuente
has intentado usarstyle="text-decoration: underline;"
ρяσѕρєя K
1
¿Podrías saber cómo usar eso?
Michael Zeuner
has textView.setText(Html.fromHtml("<u>"+"testest"+"</u>"));
probado

Respuestas:

174

Si está utilizando un archivo XML recurso de cadena (soportes etiquetas HTML), se puede hacer uso de <b> </b>, <i> </i>y <u> </u>.

<resources>
    <string name="your_string_here">
        This is an <u>underline</u>.
    </string>
</resources>

Si desea subrayar algo del 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 esto ayude

George Artemiou
fuente
9
Probé esto. la cadena no aparece subrayada?
Michael Zeuner
5
Me he encontrado con casos en los que las <u>etiquetas pasantes subyacentes no funcionan, por ejemplo, a veces si está utilizando una fuente personalizada. Sin embargo, la programación subyacente de by UnderlineSpannunca me ha fallado, por lo que la recomendaría como la solución más confiable.
Giulio Piancastelli
No es necesario establecer texto en Java. Solo use <u>y <\u>en XML, y es suficiente.
Maksim Dmitriev
9
en mi caso, la vista previa de Android Studio no pudo determinar la etiqueta html. pero una vez que ejecuté el proyecto en un dispositivo real, el texto subrayado se mostró felizmente.
Alvin
1
<whine> el hecho de que tenga que convertir una cadena a HTML cuando Google ya nos da negrita / cursiva / normal es bastante flojo considerando que hemos tenido Android por más de 5 años ... </whine>
angryITguy
57

Utilizar este:

TextView txt = (TextView) findViewById(R.id.Textview1);
txt.setPaintFlags(txt.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
abh22ishek
fuente
Tenga en cuenta que esta solución siempre subraya todo el texto, por lo que no es factible si se quiere subrayar solo una parte. Para eso, necesitas UnderlineSpan.
Giulio Piancastelli
25
<resource>
    <string name="your_string_here">This is an <u>underline</u>.</string>
</resources>

Si no funciona entonces

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

Porque "<" podría ser una palabra clave en algún momento.

Y para mostrar

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(getString(R.string.your_string_here)));
Bhavin
fuente
3
Esto funciona ... pero si por alguna razón configura TextView para usar el atributo xml android: textAllCaps = "true", el subrayado no aparecerá. Elimine este modificador y el subrayado se mostrará según lo previsto. Solo un aviso :)
Matt W
5

En primer lugar, vaya al archivo String.xml

puede agregar cualquier atributo HTML como cursiva, negrita o subrayado aquí.

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

Otra forma de hacerlo es crear un componente personalizado que amplíe TextView. Es bueno para los casos en los que necesita tener varios TextViews subrayados.

Aquí está el código del 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);
    }
}

Y cómo usarlo en xml:

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

Puede utilizar el marcado de abajo, pero tenga en cuenta que si establece el textAllCapsque trueel efecto de subrayado se retira.

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


Nota

Usando textAllCaps con una cadena (login_change_settings) que contiene marcado; el marcado será eliminado por la conversión de mayúsculas

La transformación de texto textAllCaps terminará llamando a toString en CharSequence, que tiene el efecto neto de eliminar cualquier marcado como. Esta comprobación busca usos de cadenas que contengan marcas que también especifiquen textAllCaps = true.

Tebo
fuente
2

Hay diferentes formas de lograr texto subrayado en un TextView de Android.

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

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

2. Puede hacer lo mismo mediante programación.

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

Se puede hacer creando un SpannableString y luego configurándolo como la propiedad de texto TextView

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

Utilicé el método siguiente, funcionó para mí. A continuación se muestra un ejemplo de Button, pero también podemos usarlo en TextView.

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

Si desea comparar la cadena de texto o el texto cambiará dinámicamente, puede crear una vista en el diseño de restricción que se ajustará de acuerdo con la longitud del 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
fuente
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);
            }
        }
    }

Manera más fácil

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

También es compatible con niños de TextView como EditText, Button, Checkbox

Si tu quieres

- ¿Texto subrayado en el que se puede hacer clic?

- ¿Subrayar varias partes de TextView?

Entonces revisa esta respuesta

Khemraj
fuente