texto tachar subrayar studio boton android android-layout fonts

tachar - ¿Puedo subrayar el texto en un diseño de Android?



texto clickable android studio (21)

¿Cómo puedo definir el texto subrayado en un archivo xml diseño de Android?


Maldita sea, es muy simple de usar

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

Subrayar todo TextView

setUnderLineText(tv, tv.getText().toString());

Subrayar alguna parte de TextView

setUnderLineText(tv, "some");

También admite niños 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); } } }

revise mi respuesta aquí para hacer texto subrayado seleccionable o subrayar múltiples partes de TextView


Una solución de línea

myTextView.setText(Html.fromHtml("<p><u>I am Underlined text</u></p>"));

Es un poco tarde pero podría ser útil para alguien.


  1. Ir al archivo de recursos strings.xml
  2. Agregue una cadena en el archivo de recursos con una etiqueta de subrayado HTML cuando sea necesario.

strings.xml muestra de subrayado HTML

  1. Llame a la ID de recurso de cadena en su código Java de la siguiente manera:

sampleTextView.setText(R.string.sample_string);

  1. La salida debe tener la palabra "" subrayada.

Además, el siguiente código no imprimirá el subrayado:

String sampleString = getString(R.string.sample_string); sampleTextView.setText(sampleString);

En su lugar, use el siguiente código para conservar el formato de texto enriquecido:

CharSequence sampleString = getText(R.string.sample_string); sampleTextView.setText(sampleString);

"Puede usar getString (int) o getText (int) para recuperar una cadena. GetText (int) retiene cualquier estilo de texto enriquecido aplicado a la cadena". Documentación de Android.

Consulte la documentación: https://developer.android.com/guide/topics/resources/string-resource.html

Espero que esto ayude.


Contenido del archivo Strings.xml:

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

El archivo XML de diseño debe usar el recurso de cadena anterior con las siguientes propiedades de vista de texto, como se muestra a continuación:

<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" />


Echa un vistazo al estilo del botón subrayado subrayado:

<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:


En la función de extensión Kotlin se puede utilizar. Esto solo puede ser usado desde el código, no xml.

fun TextView.underline() { paintFlags = paintFlags or Paint.UNDERLINE_TEXT_FLAG }

Uso:

tv_change_number.underline() tv_resend_otp.underline()


La respuesta "aceptada" de arriba NO funciona (cuando intenta usar la cadena como textView.setText(Html.fromHtml(String.format(getString(...), ...))) .

Como se indica en las documentations , debe escapar del corchete de apertura de las etiquetas internas con la etiqueta &lt; , por ejemplo, el resultado debería verse como:

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

Luego en tu código puedes configurar el texto con:

TextView textView = (TextView) view.findViewById(R.id.textview); textView.setText(Html.fromHtml(String.format(getString(R.string.my_string), ...)));


Otra solución es crear una vista personalizada que extienda TextView como se muestra a continuación.

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); } }

y simplemente añadir a XML como se muestra a continuación

<yourpackage.UnderLineTextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="underline text" />


Para Button y TextView esta es la forma más fácil:

Botón:

button = (Button) view.findViewById(R.id.btton1); button.setPaintFlags(button.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

Vista de texto:

textView = (Textview) view.findViewById(R.id.textview1); textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);


Puedes probar con

textview.setPaintFlags(textview.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);


Romain Guy describe el enfoque más reciente para dibujar texto subrayado en un medium con el código fuente disponible en GitHub . Esta aplicación de muestra expone dos posibles implementaciones:

  • Una implementación basada en la ruta que requiere el nivel de API 19
  • Una implementación basada en la región que requiere API nivel 1


Sé que esta es una respuesta tardía, pero se me ocurrió una solución que funciona bastante bien ... Tomé la respuesta de Anthony Forloney para subrayar el texto en código y creé una subclase de TextView que se encarga de eso. Luego, solo puede usar la subclase en XML cada vez que quiera tener un TextView subrayado.

Aquí está la clase que creé:

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; } }

Ahora ... cuando quiera crear una vista de texto subrayada en XML, simplemente haga lo siguiente:

<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"/>

He añadido opciones adicionales en este fragmento de código XML para mostrar que mi ejemplo funciona cambiando el color, el tamaño y el estilo del texto ...

¡Espero que esto ayude!


Se puede lograr si está utilizando un archivo xml de recursos de cadena , que admite etiquetas HTML como <b></b> , <i></i> y <u></u> .

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

Si quieres subrayar algo del uso del código:

TextView textView = (TextView) view.findViewById(R.id.textview); SpannableString content = new SpannableString("Content"); content.setSpan(new UnderlineSpan(), 0, content.length(), 0); textView.setText(content);


Simplemente use el atributo en el archivo de recursos de cadena, por ejemplo

<string name="example"><u>Example</u></string>


Simplifiqué la respuesta de Samuel :

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!--https://.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>


Tuve un problema en el que utilizo una fuente personalizada y el subrayado creado con el truco del archivo de recursos ( <u>Underlined text</u> ) funcionó, pero Android logró transformar el subrayado en una especie de canal de huelga.

Utilicé esta respuesta para dibujar un borde debajo de la vista de texto: https://.com/a/10732993/664449 . Obviamente, esto no funciona para texto subrayado parcial o multilínea.


Una forma más limpia en lugar de la
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); el método es usar textView.getPaint().setUnderlineText(true);

Y si necesita más tarde desactivar el subrayado para esa vista, como en una vista reutilizada en un RecyclerView, textView.getPaint().setUnderlineText(false);


Una solución de línea:

textview.setPaintFlags(textview.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);


Una solución simple y 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" />


Utilicé este dibujo xml para crear un borde inferior y apliqué el dibujo como fondo a mi vista de texto

<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>


prueba este código

en XML

<resource> <string name="my_text"><![CDATA[This is an <u>underline</u>]]></string> </resources>

en codigo

TextView textView = (TextView) view.findViewById(R.id.textview); textView.setText(Html.fromHtml(getString(R.string.my_text)));

¡Buena suerte!