Gibt es eine einfache Möglichkeit, Text in einem App-Widget zu durchsuchen?

138

Ich habe mich gefragt, ob es eine einfache Möglichkeit gibt, Text in einem App-Widget in Android zu finden. Bei einer normalen Aktivität ist es ziemlich einfach, Textansichtsflags zu verwenden:

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

Aber da ich in einem App-Widget nur Remoteviews verwenden kann ... weiß ich nicht, ob dies möglich ist

Weiß jemand etwas darüber?

Vielen Dank!

Antonio
quelle
Siehe meine Antwort hier! stackoverflow.com/a/35351523/250260
Jorgesys
Wenn Sie eine xml-onlyLösung wie mich wollen: stackoverflow.com/a/49062515/3579786
Jiyeh

Antworten:

67

Sie können dies verwenden:

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

Natürlich können Sie auch andere Flags aus der android.graphics.Paint-Klasse hinzufügen.

Agirardello
quelle
8
Ich weiß nicht, wie das nicht mehr Stimmen bekommen hat, es beantwortet die Frage perfekt. Vielen Dank.
James Cross
Zunächst ist unklar, was Remoteviews sind, und funktioniert nicht für alle Android-Versionen.
Akshat Tailang
Dies ist die Antwort, nach der wir suchen. Die Arbeit mit App-Widgets auf androidTextViews ist nur über removeViews möglich. Ein direkter Zugriff auf TextView ist derzeit nicht möglich.
Endevour
188

Programmgesteuert in einer Textansicht, in anderen Ansichten nicht getestet >>

TextView tv = (TextView) findViewById(R.id.mytext);
tv.setText("This is strike-thru");
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
ruhalde
quelle
13
Dies ist für App-Widgets nicht möglich. Sie funktionieren nur mit RemoteViews und es gibt keine Methode zum Lesen der Malflags.
Ridcully
78

Ein anderer Weg, dies programmgesteuert zu tun, der ein bisschen weniger wie ein Hack aussieht als der Paint-Weg:

Anstatt zu tun:

tv.setText(s);

machen:

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
quelle
Dank funktioniert wie ein Zauber Besonders wenn Sie einen Teil von TextView benötigen, um eine durchgestrichene Linie zu haben
Diljeet
+1 Lösung mit Spannable hat funktioniert, vielen Dank. Du hast meinen Tag gerettet. Danke Mann;)
Simon Dorociak
Dies beantwortet die Frage nicht, da dies nicht gilt fürRemoteView
Alex.F
@ Alex.FIch bin etwas überrascht, da dies beispielsweise in Benachrichtigungen (bei denen es sich um Remote-Ansichten handelt) funktioniert. Ich muss zugeben, dass ich nicht mit AppWidgets getestet habe.
BoD
1
Es funktioniert mit App Widgets (jede Framework-Spanne, die ParcelableSpan implementiert, sollte funktionieren)
Karsten
58

Update 2015: Leute, dies ist für sehr alte Versionen von Android. Sehen Sie andere Antworten für moderne Lösungen!


Um die gesamte Textansicht zu durchlaufen, können Sie ein bestimmtes Hintergrundbild verwenden, um den Durchgestrichen-Effekt zu simulieren:

android:background="@drawable/bg_strikethrough"

Wo das bg_strikethroughDrawable ein 9-Patch ist, der eine durchgezogene Linie durch die Mitte hält und auf beiden Seiten wächst, mit so viel Polsterung, wie Sie für angemessen halten. Ich habe eine davon verwendet:

Alt-Text

(zur Verdeutlichung vergrößert .. 1300%!)

Alt-Text

Das ist meine HDPI-Version. Speichern Sie sie also (die erste http://i.stack.imgur.com/nt6BK.png ) als res/drawable-hdpi/bg_strikethrough.9.pngund die Konfiguration funktioniert wie folgt:

Alt-Text

Ohhorob
quelle
und was tun, wenn die Textansicht länger als der Text ist und nur der Text durchgestrichen werden soll?
Mai
nur für schwarz und einzeiligen Text ... @ruhalde hat bei mir funktioniert.
ahmed_khan_89
27

Dazu können Sie dies verwenden

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

und zum Entfernen können Sie dies verwenden

 title.setPaintFlags(title.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
pavel
quelle
1
Wie kann ich Streikfarbe hinzufügen
Harsha
@Harsha dies scheint nur zu erlauben, die Farbe des Textes zu verwenden. Wenn Sie eine andere durchgestrichene Farbe wünschen, müssen Sie eine andere Implementierungsmethode ausprobieren.
Michael
19

Wenn Sie ein einzelnes Wort haben, können wir Drawable verwenden. Es folgt das Beispiel:

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

Wenn Sie mehrere Zeilen haben, können Sie den folgenden Code verwenden:

TextView someTextView = (TextView) findViewById(R.id.some_text_view);
someTextView.setText(someString);
someTextView.setPaintFlags(someTextView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG)
Akshay Mukadam
quelle
@ Skizo Ich bin froh, dass es Ihnen geholfen hat
Akshay Mukadam
13

Hier ist eine Erweiterung für alle Kotlin-Leute

fun TextView.showStrikeThrough(show: Boolean) {
    paintFlags =
            if (show) paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
            else paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
}

Verwendung

textView.showStrikeThrough(true)

Einschränkung

Durchgestrichene können nur die gleiche Farbe wie der Text haben

(dh roter Text und blaues Durchstreichen sind nicht möglich)

Michael
quelle
9

Für mehrzeiliges TextView sollten Sie android.text.style.CharacterStyle wie folgt verwenden:

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

Es ist wirklich einfach, wenn Sie Zeichenfolgen verwenden:

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

Und dann einfach:

<TextView 
        ...
         android:text="@string/line"
 />
Ignacio Alorre
quelle
4
@war_Hero Hat für mich funktioniert, wird jedoch nicht im Renderer von Android Studio gerendert. Musste es tatsächlich bauen, um es zu sehen.
Mic Fok
8

Fügen Sie die folgende Zeile hinzu: -

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

Verwenden Sie Ihre Referenz anstelle von "tv"

ChandraMouli Poreddy
quelle
1
Dies bezieht sich nicht auf die Frage, er fragt nach einem RemoteViews-Objekt in einem AppWidget.
Matthew
3

Versuchen Sie diesen Code

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

Für Lollipop und höher. Erstellen Sie ein 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>

und benutze es als Vordergrund.
android:foreground="@drawable/strike_through"

Akshay Mehr
quelle
0

Sie fügen hinzu:

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

Sie setzen / fügen in Sie Variable hinzu:

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

und fügen Sie dann .setPaintFlags in variableTv hinzu:

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

Ich habe einige Optionen ausprobiert, aber das funktioniert am besten für mich:

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

Prost

Milos Simic Simo
quelle
0

Android-Ressourcen unterstützen HTML-Markups ziemlich gut
Die folgenden HTML-Elemente werden unterstützt:

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

Beachten Sie jedoch, dass es nicht in der Vorschau von Android Studio-Layouts gerendert wird. Zuletzt getestet auf Android Studio 3.3.1

Zum Beispiel sieht der Durchgestrichene so aus:

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

Ich habe dies regelmäßig (lokal) gemacht TextView, und es sollte auf der Remote-Variante funktionieren, da in den Dokumenten die Methode als äquivalent zwischen den beiden aufgeführt ist:

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

Blrfl
quelle
Es funktioniert nicht :(. Ich mache das: remoteView.setTextViewText (R.id.text, Html.fromHtml ("<del>" + value + "</ del>"));
Antonio
Es kann sein, dass dies <del>nicht von unterstützt wird Html.fromHtml(). Hast du es versucht <strike>oder <s>?
Blrfl
Danke Blrfl, aber es funktioniert auch nicht. Es scheint, dass nur wenige HTML-Tags von Html.fromHtml () unterstützt werden.
Antonio
Schade. Entschuldigung, ich konnte nicht helfen.
Blrfl
Wie kann ich für Preis mit Streik wie Shopping-Apps für Angebote erreichen
Harsha
-1

Ich weiß, ich beantworte eine alte Frage, es könnte für jemand anderen hilfreich sein, einen bestimmten Teil von TextView programmgesteuert hervorzuheben.

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

In diesem Beispielcode ist 5 die Startposition und 8 die Endposition des Textes, die gestrichen werden müssen. Nach dem Ausführen dieses Codes können wir den Text "brauchen" mit durchgestrichenem Code erhalten. Hoffe, es wird für jemand anderen hilfreich sein.

Ram Koti
quelle