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.