Czy istnieje łatwy sposób przekreślenia tekstu w widżecie aplikacji?

138

Zastanawiałem się, czy istnieje łatwy sposób na wykreślenie tekstu w widżecie aplikacji na Androida. W normalnej aktywności jest to całkiem proste, używając flag Textview:

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

Ale ponieważ w widżecie aplikacji mogę używać tylko zdalnych podglądów ... Nie wiem, czy to jest możliwe

Czy ktoś coś o tym wie?

Dzięki!

Antonio
źródło
Zobacz moją odpowiedź tutaj! stackoverflow.com/a/35351523/250260
Jorgesys
Jeśli chcesz xml-onlyrozwiązania takiego jak ja: stackoverflow.com/a/49062515/3579786
Jiyeh

Odpowiedzi:

68

Możesz użyć tego:

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

Oczywiście możesz także dodać inne flagi z klasy android.graphics.Paint.

agirardello
źródło
8
Nie wiem, jak to nie zyskało większej liczby głosów, doskonale odpowiada na pytanie. Dzięki.
James Cross
Po pierwsze, nie jest jasne, co to jest zdalne przeglądanie, a ponadto nie działa dla wszystkich wersji Androida.
akshat tailang
To jest odpowiedź, której szukamy, praca z widżetami aplikacji na androidTextViews jest dostępna tylko poprzez removeViews. W tym momencie nie jest możliwy bezpośredni dostęp do TextView.
endevour
188

Aby zrobić to programowo w widoku tekstowym, niesprawdzonym w innych widokach >>

TextView tv = (TextView) findViewById(R.id.mytext);
tv.setText("This is strike-thru");
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
ruhalde
źródło
13
Nie jest to możliwe w przypadku widżetów aplikacji. Działają tylko z RemoteViews i nie ma metody odczytywania flag malowania.
Ridcully,
78

Inny sposób na zrobienie tego programowo, który wygląda trochę mniej jak hack niż sposób Paint:

Zamiast robić:

tv.setText(s);

robić:

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
źródło
Dzięki działa jak urok Szczególnie, gdy potrzebujesz jakiejś części TextView, aby mieć przekreśloną linię
Diljeet
Rozwiązanie +1 z Spannable działało, bardzo dziękuję. Uratowałeś mi dzień. Dzięki stary;)
Simon Dorociak
To nie odpowiada na pytanie, ponieważ nie dotyczyRemoteView
Alex.F
@ Alex.FI jestem trochę zaskoczony, ponieważ działa to na przykład w powiadomieniach (które są zdalnymi widokami). Muszę przyznać, że nie testowałem jednak z AppWidgets.
BoD
1
Działa z widżetami aplikacji (każdy framework, który implementuje ParcelableSpan, powinien działać)
Karsten
58

Aktualizacja 2015: ludzie, to jest dla bardzo starych wersji Androida. Zobacz inne odpowiedzi na nowoczesne rozwiązania!


Aby przekreślić cały widok tekstu, możesz użyć określonego obrazu tła, aby zasymulować efekt przekreślenia:

android:background="@drawable/bg_strikethrough"

Tam, gdzie można bg_strikethroughwyciągnąć, jest 9-łatka, która utrzymuje ciągłą linię przez środek, rosnącą po obu stronach, z tak dużą wyściółką, jaką uważasz za rozsądną. Użyłem takiego:

tekst alternatywny

(powiększony dla przejrzystości .. 1300%!)

tekst alternatywny

To jest moja wersja HDPI, więc zapisz ją (pierwszą http://i.stack.imgur.com/nt6BK.png ) jako, res/drawable-hdpi/bg_strikethrough.9.pnga konfiguracja będzie działać tak:

tekst alternatywny

ohhorob
źródło
i co zrobić, jeśli TextView jest dłuższy niż tekst i tylko tekst powinien zostać przekreślony?
maysi
tylko dla tekstu czarnego i jednej linii ... @ruhalde zadziałało dla mnie.
ahmed_khan_89
27

Aby to zrobić, możesz tego użyć

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

i do usunięcia możesz tego użyć

 title.setPaintFlags(title.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
pavel
źródło
1
jak mogę dodać kolor strajku
Harsha
@Harsha wydaje się, że pozwala to tylko na użycie koloru tekstu. Jeśli chcesz mieć inny kolor przekreślenia, musisz wypróbować inną metodę implementacji.
Michael
19

Jeśli masz jedno słowo, możemy użyć do rysowania. Oto przykład:

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

jeśli masz wiele linii, możesz użyć następującego kodu:

TextView someTextView = (TextView) findViewById(R.id.some_text_view);
someTextView.setText(someString);
someTextView.setPaintFlags(someTextView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG)
Akshay Mukadam
źródło
@Skizo Cieszę się, że ci pomogło
Akshay Mukadam
13

Oto rozszerzenie dla wszystkich ludzi z 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()
}

Stosowanie

textView.showStrikeThrough(true)

Ograniczenie

Przekreślenia mogą mieć tylko ten sam kolor co tekst

(tj. czerwony tekst i niebieskie przekreślenie nie są możliwe)

Michael
źródło
9

W przypadku wielowierszowego TextView należy użyć android.text.style.CharacterStyle w następujący sposób:

SpannableString spannable = new SpannableString(text);
spannable.setSpan(new StrikethroughSpan(), 0, text.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
remoteViews.setTextViewText(R.id.itemText, spannable);
user3768270
źródło
8

Jest to naprawdę proste, jeśli używasz ciągów:

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

A potem tylko:

<TextView 
        ...
         android:text="@string/line"
 />
Ignacio Alorre
źródło
4
@war_Hero Pracował dla mnie, ale nie renderuje się w module renderującym Android Studio. Musiałem go zbudować, żeby to zobaczyć.
Mic Fok
8

Dodaj wiersz poniżej: -

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

użyj odniesienia zamiast „tv”

ChandraMouli Poreddy
źródło
1
To nie odnosi się do pytania, on pyta o obiekt RemoteViews w AppWidget.
Matthew
3

wypróbuj ten kod

textview.setText((Html.fromHtml("<strike>hello world!</strike>")));
Abhishek c
źródło
2

Dla Lollipopa i nowszych. stworzyć 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>

i użyj go jako pierwszego planu.
android:foreground="@drawable/strike_through"

Akshay Więcej
źródło
0

dodajesz:

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

ustawiasz / dodajesz w sobie zmienną:

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

a następnie dodaj .setPaintFlags w variableTv:

variableTv.setPaintFlags(variableTv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
Briliant Fay
źródło
0

Wypróbowałem kilka opcji, ale to działa najlepiej dla mnie:

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

Twoje zdrowie

Milos Simic Simo
źródło
0

Zasoby Androida mają całkiem dobrą obsługę znaczników
HTML Obsługiwane są poniższe elementy HTML:

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

Należy jednak pamiętać, że nie jest renderowany w podglądzie układów Android Studio. Ostatnio testowane na Android Studio 3.3.1

Na przykład przekreślenie będzie wyglądać tak:

<string name="cost"><strike>$10</strike> $5 a month</string>
Ilya Gazman
źródło
-1

Zrobiłem to regularnie (lokalnie) TextViewi powinno to działać na zdalnej odmianie, ponieważ dokumentacja podaje metodę jako równoważną między nimi:

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

Blrfl
źródło
To nie działa :(. Robię to: remoteView.setTextViewText (R.id.text, Html.fromHtml ("<del>" + value + "</del>"));
Antonio
Możliwe, że <del>nie jest to obsługiwane przez Html.fromHtml(). Czy próbowałeś <strike>lub <s>?
Blrfl
Dzięki Blrfl, ale to też nie działa. Wygląda na to, że tylko kilka tagów HTML jest obsługiwanych przez Html.fromHtml ().
Antonio
Porażka. Przepraszam, nie mogłem pomóc.
Blrfl
jak mogę osiągnąć taką cenę za pomocą strajku, jak aplikacje do zakupów dla ofert
Harsha
-1

Wiem, odpowiadam na stare pytanie, może to być pomocne dla kogoś innego, aby programowo wykreślić określoną część TextView.

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

Tak więc w tym przykładzie kod 5 to pozycja początkowa, a 8 to pozycja końcowa tekstu, które należy wykreślić, więc po uruchomieniu tego kodu możemy uzyskać tekst „potrzeba” z przekreśleniem. Mam nadzieję, że będzie to pomocne dla kogoś innego.

Ram Koti
źródło