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!


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

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.


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

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

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


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

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)

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


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

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

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"


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

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"


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

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


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>

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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.