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.