Есть ли простой способ зачеркнуть текст в виджете приложения? - PullRequest
130 голосов
/ 07 октября 2010

Мне было интересно, есть ли простой способ выделить текст в виджете приложения в Android.В обычной деятельности это довольно просто, используя флажки textview:

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

Но поскольку в виджете приложения я могу использовать только удаленные виды ... Я не знаю, возможно ли это

Кто-нибудь знает что-нибудь об этом?

Спасибо!

Ответы [ 17 ]

179 голосов
/ 19 июля 2011

Чтобы сделать это программно в текстовом виде, не протестировано в других представлениях >>

TextView tv = (TextView) findViewById(R.id.mytext);
tv.setText("This is strike-thru");
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
77 голосов
/ 31 июля 2012

Другой способ сделать это программно, который выглядит немного менее как хак, чем способ Paint:

Вместо выполнения:

tv.setText(s);

do:

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);
59 голосов
/ 20 января 2011

2015 Обновление: Ребята, это для очень старых версий Android.Смотрите другие ответы для современных решений!


Чтобы прорваться через весь текстовый вид, вы можете использовать определенное фоновое изображение для имитации эффекта зачеркивания:

android:background="@drawable/bg_strikethrough"

Где bg_strikethrough drawable - это 9-патч, который удерживает сплошную линию через середину, растя по обеим сторонам, с сколь угодно большим количеством отступов.Я использовал один такой:

alt text

(увеличено для ясности .. 1300%!)

alt text

Это моя версия HDPI, поэтому сохраните ее (первую http://i.stack.imgur.com/nt6BK.png) как res/drawable-hdpi/bg_strikethrough.9.png, и конфигурация будет работать так:

alt text

57 голосов
/ 09 октября 2011

Вы можете использовать это:

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

Конечно, вы также можете добавить другие флаги из класса android.graphics.Paint.

21 голосов
/ 07 мая 2017

Для этого вы можете использовать это

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

, а для удаления вы можете использовать это

 title.setPaintFlags(title.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
19 голосов
/ 05 декабря 2014

Если у вас есть одно слово, мы можем использовать рисование.Ниже приведен пример:

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

, если у вас несколько строк, вы можете использовать следующий код:

TextView someTextView = (TextView) findViewById(R.id.some_text_view);
someTextView.setText(someString);
someTextView.setPaintFlags(someTextView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG)
10 голосов
/ 23 июня 2014

Для многострочного TextView вы должны использовать android.text.style.CharacterStyle следующим образом:

SpannableString spannable = new SpannableString(text);
spannable.setSpan(new StrikethroughSpan(), 0, text.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
remoteViews.setTextViewText(R.id.itemText, spannable);
8 голосов
/ 07 июня 2014

Это действительно легко, если вы используете строки:

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

А потом просто:

<TextView 
        ...
         android:text="@string/line"
 />
8 голосов
/ 23 ноября 2015

Добавьте строку ниже: -

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

используйте вашу ссылку вместо "tv"

3 голосов
/ 21 мая 2018

попробуйте этот код

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