Existe uma maneira fácil de percorrer o texto em um widget de aplicativo?

138

Fiquei me perguntando se existe uma maneira fácil de localizar texto dentro de um widget de aplicativo no Android. Em uma atividade normal, é bastante fácil usar sinalizadores de texto:

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

Mas como em um widget de aplicativo, posso usar apenas remoteviews ... Não sei se isso é possível

Alguém sabe alguma coisa sobre isso?

Obrigado!

Antonio
fonte
Veja minha resposta aqui! stackoverflow.com/a/35351523/250260
Jorgesys
Se você quiser uma xml-onlysolução como a minha: stackoverflow.com/a/49062515/3579786 #
31418
1
pode ajudar ... 6 maneiras - Android TextView StrikeThrough
c49 04/03

Respostas:

68

Você pode usar isto:

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

Claro que você também pode adicionar outros sinalizadores da classe android.graphics.Paint.

agirardello
fonte
8
Não sei como isso não recebe mais votos, ele responde perfeitamente à pergunta. Obrigado.
James Cross
Primeiro, não está claro o que é remoteviews, além de não funcionar em todas as versões do Android.
tailang Akshat
Esta é a resposta que estamos procurando, trabalhando com widgets de aplicativos no androidTextViews só são acessíveis através do removeViews. O acesso direto ao TextView não é possível neste momento.
endevour 19/03
188

Para fazer isso de forma programática em uma visualização de texto, não testada em outras visualizações >>

TextView tv = (TextView) findViewById(R.id.mytext);
tv.setText("This is strike-thru");
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
ruhalde
fonte
13
Isso não é possível para widgets de aplicativos. Eles funcionam apenas com o RemoteViews e não há método para ler os sinalizadores de tinta.
Ridcully
78

Outra maneira de fazer isso de forma programática, que se parece menos com um hack do que com o Paint:

Em vez de fazer:

tv.setText(s);

Faz:

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
fonte
Graças funciona como um encanto especialmente quando você precisa de alguma parte do TextView ter linha tachado
Diljeet
Solução +1 com Spannable funcionou, muito obrigado. Você salvou o meu dia. Obrigado cara;)
Simon Dorociak 01/09/14
Isso não responder à pergunta como esta não se aplica aRemoteView
Alex.F
@ Alex.FI Estou um pouco surpreso, pois isso funciona, por exemplo, em Notificações (que são visualizações remotas). Devo admitir que não testei com o AppWidgets.
CA
1
Ele faz o trabalho com o App Widgets (qualquer extensão estrutura que implementa ParcelableSpan deve funcionar)
Karsten
58

Atualização de 2015: Pessoal, isso é para versões muito antigas do Android. Veja outras respostas para soluções modernas!


Para percorrer toda a exibição de texto, você pode usar uma imagem de plano de fundo específica para simular o efeito tachado:

android:background="@drawable/bg_strikethrough"

Onde o bg_strikethroughdrawable é um patch de 9 que mantém uma linha sólida no meio, crescendo de ambos os lados, com o máximo de preenchimento que você acha razoável. Eu usei um como este:

texto alternativo

(ampliado para maior clareza .. 1300%!)

texto alternativo

Essa é a minha versão do HDPI, então salve-a (a primeira http://i.stack.imgur.com/nt6BK.png ) res/drawable-hdpi/bg_strikethrough.9.pnge a configuração funcionará da seguinte forma:

texto alternativo

ohhorob
fonte
e o que fazer se o TextView for mais longo que o texto e apenas o texto for atingido?
May
apenas para texto preto e uma linha ... @ruhalde funcionou para mim.
21916 Ahmed_khan_89
27

Para fazer isso, você pode usar este

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

e para remover você pode usar isso

 title.setPaintFlags(title.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
pavel
fonte
1
Como posso adicionar cor greve
Harsha
@ Harsha isso parece permitir apenas que você use a cor do texto. Se você quiser uma cor tachada diferente, precisará tentar outro método de implementação.
Michael
19

Se você tiver uma única palavra, podemos usar drawable. A seguir está o exemplo:

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

se você tiver várias linhas, poderá usar o seguinte 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
fonte
@Skizo eu estou contente que isso te ajudou
Akshay Mukadam
13

Aqui está uma extensão para todos vocês, pessoal da 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)

Limitação

Tachas só podem ter a mesma cor que o texto

(isto é, texto em vermelho e rasurado em azul não é possível)

Michael
fonte
9

Para TextView com várias linhas, você deve usar android.text.style.CharacterStyle assim:

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

É realmente fácil se você estiver usando strings:

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

E então apenas:

<TextView 
        ...
         android:text="@string/line"
 />
Ignacio Alorre
fonte
4
@war_Hero Funcionou para mim, mas não é renderizado no renderizador do Android Studio. Tive que construí-lo para vê-lo.
quer
8

Adicione a linha abaixo: -

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

use sua referência em vez de "tv"

ChandraMouli Poreddy
fonte
1
Isso não faz referência à pergunta, ele está perguntando sobre um objeto RemoteViews em um AppWidget.
Matthew
3

tente este código

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

Para pirulito e acima. criar um drawable

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

e use-o como primeiro plano.
android:foreground="@drawable/strike_through"

Akshay Mais
fonte
0

você adiciona:

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

você define / adiciona na sua variável:

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

e adicione .setPaintFlags em variableTv:

variableTv.setPaintFlags(variableTv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
Briliant Fay
fonte
0

Eu tentei algumas opções, mas isso funciona melhor para mim:

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

Felicidades

Milos Simic Simo
fonte
0

Os recursos do Android têm um ótimo suporte à marcação HTML
Os elementos HTML abaixo são suportados:

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=”…”>

Observe, no entanto, que ele não é renderizado na pré-visualização de layouts do Android Studio. Último teste no Android Studio 3.3.1

Por exemplo, o tachado será assim:

<string name="cost"><strike>$10</strike> $5 a month</string>
Ilya Gazman
fonte
-1

Eu fiz isso regularmente (local) TextViewe deve funcionar na variedade remota, pois os documentos listam o método como equivalente entre os dois:

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

Blrfl
fonte
Não funciona :(. Estou fazendo isso: remoteView.setTextViewText (R.id.text, Html.fromHtml ("<del>" + value + "</del>"));
Antonio
Pode ser que <del>não seja suportado por Html.fromHtml(). Você já tentou <strike>ou <s>?
Blrfl
Obrigado Blrfl, mas também não funciona. Parece que apenas algumas tags HTML são suportadas por Html.fromHtml ().
Antonio
Vadio. Desculpe por não poder ajudar.
Blrfl
Como posso conseguir por preço com greve como comprar aplicativos para ofertas
Harsha
-1

Sei que estou respondendo a uma pergunta antiga, pode ser útil para outra pessoa, por eliminar uma parte específica do TextView programaticamente.

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

Portanto, neste código de exemplo, 5 é a posição inicial e 8 é a posição final do texto que precisam ser eliminadas; portanto, após a execução desse código, podemos obter o texto "necessitado" com eliminado. Espero que seja útil para outra pessoa.

Ram Koti
fonte