¿Hay una manera fácil de tachar texto en un widget de aplicación?


138

Me preguntaba si hay una manera fácil de tachar texto dentro de un widget de aplicación en Android. En una actividad normal, es bastante fácil, utilizando indicadores de vista de texto:

textView.setPaintFlags(textView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

Pero como en un widget de aplicación, solo puedo usar vistas remotas ... No sé si esto es posible

Alguien sabe algo sobre esto?

¡Gracias!


¡Mira mi respuesta aquí! stackoverflow.com/a/35351523/250260
Jorgesys

Si desea una xml-onlysolución como yo: stackoverflow.com/a/49062515/3579786
Jiyeh

Respuestas:


68

Puedes usar esto:

remoteviews.setInt(R.id.YourTextView, "setPaintFlags", Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);

Por supuesto, también puede agregar otras banderas de la clase android.graphics.Paint.


8
No sé cómo esto no ha obtenido más votos, responde perfectamente la pregunta. Gracias.
James Cross

Primero, no está claro qué son las vistas remotas, además no funciona para todas las versiones de Android.
akshat tailang

Esta es la respuesta que estamos buscando, trabajar con widgets de aplicaciones en androidTextViews solo es accesible a través de removeViews. Acceder a TextView directamente no es posible en este momento.
endevour

188

Para hacerlo programáticamente en una vista de texto, no probado en otras vistas >>

TextView tv = (TextView) findViewById(R.id.mytext);
tv.setText("This is strike-thru");
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

13
Esto no es posible para App-Widgets. Solo funcionan con RemoteViews y no hay ningún método para leer las banderas de pintura.
Ridcully

78

Otra forma de hacerlo mediante programación que se parece un poco menos a un truco que la forma Paint:

En lugar de hacer:

tv.setText(s);

hacer:

private static final StrikethroughSpan STRIKE_THROUGH_SPAN = new StrikethroughSpan();
...
tv.setText(s, TextView.BufferType.SPANNABLE);
Spannable spannable = (Spannable) tv.getText();
spannable.setSpan(STRIKE_THROUGH_SPAN, 0, s.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

Gracias funciona a las mil maravillas Especialmente cuando necesitas que parte de TextView tenga una línea
tachada

La solución +1 con Spannable funcionó, muchas gracias. Salvaste mi día. Gracias hombre;)
Simon Dorociak

Esto no responde a la pregunta ya que esto no se aplica aRemoteView
Alex.F

@ Alex.FI estoy un poco sorprendido ya que esto funciona, por ejemplo, en Notificaciones (que son vistas remotas). Sin embargo, debo admitir que no he probado con AppWidgets.
BoD

1
Funciona con widgets de aplicaciones (cualquier intervalo de marco que implemente ParcelableSpan debería funcionar)
Karsten

58

Actualización de 2015: amigos, esto es para versiones muy antiguas de Android. ¡Vea otras respuestas para soluciones modernas!


Para tachar la vista de texto completo, puede usar una imagen de fondo específica para simular el efecto tachado:

android:background="@drawable/bg_strikethrough"

Donde el bg_strikethroughdibujable es un parche de 9 que mantiene una línea sólida en el medio, creciendo a ambos lados, con la cantidad de relleno que creas razonable. He usado uno como este:

texto alternativo

(ampliado para mayor claridad ... ¡1300%!)

texto alternativo

Esa es mi versión HDPI, así que guárdela (la primera http://i.stack.imgur.com/nt6BK.png ) como res/drawable-hdpi/bg_strikethrough.9.pngy la configuración funcionará así:

texto alternativo


¿Y qué hacer si TextView es más largo que el texto y solo se debe tachar el texto?
maysi

solo para texto en negro y una línea ... @ruhalde funcionó para mí.
ahmed_khan_89

27

Para hacer esto puedes usar esto

 title.setPaintFlags(title.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

y para eliminar puedes usar esto

 title.setPaintFlags(title.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));

1
¿Cómo puedo agregar color de huelga?
Harsha

@Harsha parece que esto solo te permite usar el color del texto. Si desea un color tachado diferente, tendrá que probar otro método de implementación.
Michael

19

Si tiene una sola palabra, podemos usar dibujable. El siguiente es el ejemplo:

<item android:state_pressed="false"><shape android:shape="line">
        <stroke android:width="2dp" android:color="#ffffff" />
    </shape>
</item>

Si tiene varias líneas, puede usar el siguiente código:

TextView someTextView = (TextView) findViewById(R.id.some_text_view);
someTextView.setText(someString);
someTextView.setPaintFlags(someTextView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG)

@Skizo Me alegro de que te haya ayudado
Akshay Mukadam

14

Aquí hay una extensión para todos ustedes, amigos de Kotlin

fun TextView.showStrikeThrough(show: Boolean) {
    paintFlags =
            if (show) paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
            else paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
}

Uso

textView.showStrikeThrough(true)

Limitación

Los tachados solo pueden ser del mismo color que el texto

(es decir, el texto rojo y el tachado azul no es posible)


9

Para TextView multilínea, debe usar android.text.style.CharacterStyle de esta manera:

SpannableString spannable = new SpannableString(text);
spannable.setSpan(new StrikethroughSpan(), 0, text.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
remoteViews.setTextViewText(R.id.itemText, spannable);

8

Es realmente fácil si está utilizando cadenas:

<string name="line"> Not crossed <strike> crossed </strike> </string>

Y luego solo:

<TextView 
        ...
         android:text="@string/line"
 />

44
@war_Hero Funcionó para mí, aunque no se procesa en el renderizador de Android Studio. Tuve que construirlo para verlo.
Mic Fok

8

Agregue la línea a continuación: -

TextView tv=(TextView) v.findViewById(android.R.id.text1);
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

usa tu referencia en lugar de "tv"


1
Esto no hace referencia a la pregunta, está preguntando sobre un objeto RemoteViews en un AppWidget.
Mateo

3

prueba este código

textview.setText((Html.fromHtml("<strike>hello world!</strike>")));

2

Para Lollipop y superior. crear un dibujable

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="false">
        <shape android:shape="line">
            <stroke android:width="1dp"
                android:color="@color/onePlusRed" />
        </shape>
    </item>
</selector>

y úsalo como primer plano.
android:foreground="@drawable/strike_through"


esto solo funcionará para textos de una sola línea, ya que depende de la vista
Billy

0

agregas:

TextView variableTv = (TextView) findViewById(R.id.yourText);

establece / agrega en su variable:

variableTv.setText("It's Text use Style Strike");

y luego agregue .setPaintFlags en variableTv:

variableTv.setPaintFlags(variableTv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

0

Intenté algunas opciones, pero esto funciona mejor para mí:

String text = "<strike><font color=\'#757575\'>Some text</font></strike>";
textview.setText(Html.fromHtml(text));

salud


0

Los recursos de Android tienen un buen soporte de marcado HTML.
Los siguientes elementos HTML son compatibles:

Bold: <b>, <em>
Italic: <i>, <cite>, <dfn>
25% larger text: <big>
20% smaller text: <small>
Setting font properties: <font face=”font_family color=”hex_color”>. Examples of possible font families include monospace, serif, and sans_serif.
Setting a monospace font family: <tt>
Strikethrough: <s>, <strike>, <del>
Underline: <u>
Superscript: <sup>
Subscript: <sub>
Bullet points: <ul>, <li>
Line breaks: <br>
Division: <div>
CSS style: <span style=”color|background_color|text-decoration”>
Paragraphs: <p dir=”rtl | ltr style=”…”>

Sin embargo, tenga en cuenta que no se representa en la vista previa de diseños de estudio de Android. Última prueba en Android Studio 3.3.1

Por ejemplo, el Tachado se verá así:

<string name="cost"><strike>$10</strike> $5 a month</string>

-1

He hecho esto de forma regular (local) TextView, y debería funcionar en la variedad remota, ya que los documentos enumeran el método como equivalente entre los dos:

remote_text_view.setText(Html.fromHtml("This is <del>crossed off</del>."));


No funciona :(. Estoy haciendo esto: remoteView.setTextViewText (R.id.text, Html.fromHtml ("<del>" + value + "</del>"));
Antonio

Puede ser que <del>no sea compatible con Html.fromHtml(). ¿Has probado <strike>o <s>?
Blrfl

Gracias Blrfl, pero tampoco funciona. Parece que solo unas pocas etiquetas HTML son compatibles con Html.fromHtml ().
Antonio

Gorrón. Lo siento, no pude ayudar.
Blrfl

¿Cómo puedo lograr el precio con huelga como comprar aplicaciones para ofertas
Harsha

-1

Lo sé, estoy respondiendo una vieja pregunta, podría ser útil para otra persona, para eliminar una porción particular de TextView mediante programación.

TextView textView = (TextView) findViewById(R.id.textView);
textView.setText("Text need to be set here", TextView.BufferType.SPANNABLE);
Spannable spannable = (Spannable) textView.getText();
spannable.setSpan(new StrikethroughSpan(), 5, 8, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

Entonces, en este código de ejemplo, 5 es la posición inicial y 8 es la posición final del texto que debe eliminarse, por lo que después de ejecutar este código podemos obtener el texto "necesidad" con tachado. Espero que sea útil para alguien más.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.