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

Antonio
fuente
¡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.

agirardello
fuente
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);
ruhalde
fuente
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);
BoD
fuente
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

ohhorob
fuente
¿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));
pavel
fuente
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)
Akshay Mukadam
fuente
@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)

Miguel
fuente
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);
usuario3768270
fuente
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"
 />
Ignacio Alorre
fuente
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"

ChandraMouli Poreddy
fuente
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>")));
Abhishek c
fuente
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"

Akshay Más
fuente
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);
Fay brillante
fuente
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

Milos Simic Simo
fuente
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>
Ilya Gazman
fuente
-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>."));

Blrfl
fuente
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.

Ram Koti
fuente