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!


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.


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

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

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


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

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)

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


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

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

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"


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

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"


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

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


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>

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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.