Esiste un modo semplice per scorrere il testo in un widget app?


138

Mi chiedevo se esiste un modo semplice per inserire il testo all'interno di un widget app in Android. In un'attività normale, è abbastanza facile, usando i flag textview:

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

Ma dal momento che in un widget app, posso usare solo remotevview ... Non so se questo è possibile

Qualcuno sa qualcosa a riguardo?

Grazie!


Vedi la mia risposta qui! stackoverflow.com/a/35351523/250260
Jorgesys

Se si desidera xml-onlyuna soluzione come me: stackoverflow.com/a/49062515/3579786
Jiyeh

Risposte:


68

Puoi usare questo:

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

Naturalmente puoi anche aggiungere altre bandiere dalla classe android.graphics.Paint.


8
Non so come questo non abbia ottenuto più voti, risponde perfettamente alla domanda. Grazie.
James Cross,

Innanzitutto non è chiaro cosa siano le remoteviews, inoltre non funziona per tutte le versioni di Android.
akshat tailang

Questa è la risposta che stiamo cercando, lavorando con i widget di app su AndroidTextViews è accessibile solo tramite removeViews. L'accesso diretto a TextView non è possibile a questo punto.
termina il

188

Per farlo programmaticamente in una visualizzazione di testo, non testato in altre visualizzazioni >>

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

13
Questo non è possibile per i widget app. Funzionano solo con RemoteViews e non esiste un metodo per leggere i flag di vernice.
Ridcully

78

Un altro modo per farlo a livello di codice che assomiglia un po 'meno a un hack rispetto al modo Paint:

Invece di fare:

tv.setText(s);

fare:

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

Grazie funziona come un incantesimo Specialmente quando hai bisogno di una parte di TextView per avere una linea
barrata

+1 Soluzione con Spannable funzionata, grazie mille. Mi hai salvato la giornata. Grazie amico;)
Simon Dorociak,

Questo non risponde alla domanda in quanto non si applica aRemoteView
Alex.F

@ Alex.FI sono un po 'sorpreso dal momento che funziona, ad esempio, in Notifiche (che sono viste remote). Devo ammettere che non ho ancora testato con AppWidgets.
CdA

1
Funziona con i widget app (qualsiasi intervallo di framework che implementa ParcelableSpan dovrebbe funzionare)
Karsten

58

Aggiornamento 2015: gente, questo è per le versioni molto vecchie di Android. Vedi altre risposte per soluzioni moderne!


Per barrare l'intera vista di testo, puoi utilizzare un'immagine di sfondo specifica per simulare l'effetto barrato:

android:background="@drawable/bg_strikethrough"

Dove il bg_strikethroughdrawable è un 9-patch che mantiene una linea continua nel mezzo, crescendo su entrambi i lati, con qualsiasi imbottitura che ritieni ragionevole. Ne ho usato uno così:

testo alternativo

(ingrandito per chiarezza .. 1300%!)

testo alternativo

Questa è la mia versione HDPI, quindi salvala (la prima http://i.stack.imgur.com/nt6BK.png ) poiché res/drawable-hdpi/bg_strikethrough.9.pngla configurazione funzionerà così:

testo alternativo


e cosa fare se TextView è più lungo del testo e solo il testo deve essere barrato?
Maysi,

solo per il testo in nero e una riga ... @ruhalde ha funzionato per me.
ahmed_khan_89

27

Per fare questo puoi usare questo

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

e per rimuoverlo puoi usare questo

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

1
come posso aggiungere il colore di colpo
Harsha,

@Harsha questo sembra consentire solo di usare il colore del testo. Se vuoi un colore barrato diverso dovrai provare altri metodi di implementazione.
Michael,

19

Se hai una sola parola, possiamo usare drawable. Di seguito è riportato l'esempio:

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

se hai più righe puoi usare il seguente codice:

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

@Skizo Sono felice che ti abbia aiutato
Akshay Mukadam,

14

Ecco un'estensione per tutti voi gente di 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)

Limitazione

Le barrature possono essere solo dello stesso colore del testo

(ad es. testo rosso e barrato blu non è possibile)


9

Per TextView multilinea dovresti usare android.text.style.CharacterStyle in questo modo:

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

8

È davvero facile se stai usando le stringhe:

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

E poi solo:

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

4
@war_Hero Ha funzionato per me, tuttavia non viene visualizzato nel renderer di Android Studio. Ho dovuto davvero costruirlo per vederlo.
Mic Fok,

8

Aggiungi la riga seguente: -

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

usa il tuo riferimento invece di "tv"


1
Questo non fa riferimento alla domanda, sta chiedendo di un oggetto RemoteViews in un AppWidget.
Matteo,

3

prova questo codice

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

2

Per Lecca-lecca e oltre. crea un disegno

<?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 usalo come primo piano.
android:foreground="@drawable/strike_through"


questo funzionerà solo per i testi a riga singola poiché dipende da View
Billy

0

si aggiunge:

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

hai impostato / aggiunto la tua variabile:

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

e quindi aggiungi .setPaintFlags in variabileTv:

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

0

Ho provato alcune opzioni ma, questo funziona meglio per me:

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

Saluti


0

Le risorse Android hanno un buon supporto per il markup
HTML Sono supportati gli elementi HTML seguenti:

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

Si noti tuttavia che non viene visualizzato nell'anteprima dei layout di Android Studio. Ultimo test su Android Studio 3.3.1

Ad esempio, il Barrato apparirà così:

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

-1

L'ho fatto su un normale (locale) TextViewe dovrebbe funzionare sulla varietà remota poiché i documenti elencano il metodo come equivalente tra i due:

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


Non funziona :(. Sto facendo questo: remoteView.setTextViewText (R.id.text, Html.fromHtml ("<del>" + value + "</del>"));
Antonio,

Potrebbe non essere <del>supportato da Html.fromHtml(). Hai provato <strike>o <s>?
Blrfl,

Grazie Blrfl, ma non funziona neanche. Sembra che solo alcuni tag HTML siano supportati da Html.fromHtml ().
Antonio,

Bummer. Scusa se non ho potuto fare a meno.
Blrfl,

come posso ottenere per il prezzo con strike come app per lo shopping per le offerte
Harsha

-1

Lo so, sto rispondendo a una vecchia domanda, potrebbe essere utile per qualcun altro, per eliminare una parte particolare di TextView a livello di codice.

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

Quindi, in questo codice di esempio, 5 è la posizione iniziale e 8 la posizione finale del testo deve essere cancellata, quindi dopo aver eseguito questo codice possiamo ottenere il "bisogno" del testo cancellato. Spero che sia utile per qualcun altro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.