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!


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.


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

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

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


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

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)

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


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

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

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”


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

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"


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

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


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>

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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.