Есть ли простой способ нанести удар по тексту в виджетах приложения?

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

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

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

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

Спасибо!

Ответ 1

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

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

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

Ответ 2

Сделать это программно в текстовом виде, не проверено в других представлениях →

TextView tv = (TextView) findViewById(R.id.mytext);
tv.setText("This is strike-thru");
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

Ответ 3

Еще один способ сделать это программно, что выглядит немного хуже взлома, чем способ Paint:

Вместо этого:

tv.setText(s);

делать:

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

Ответ 4

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

Ответ 5

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

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

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

 title.setPaintFlags(title.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));

Ответ 6

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

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

Ответ 7

Для многострочного 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

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

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

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

<TextView 
        ...
         android:text="@string/line"
 />

Ответ 9

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

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

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

Ответ 10

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

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

Ответ 11

Я попробовал несколько вариантов, но это работает лучше всего для меня:

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

ура

Ответ 12

вы добавили:

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

вы устанавливаете/добавляете в переменную You:

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

а затем добавьте .setPaintFlags в переменнойTv:

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

Ответ 13

Я знаю, я отвечаю на старый вопрос, это может быть полезно для кого-то другого, для того, чтобы вычеркнуть определенную часть 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);

Таким образом, в этом примере кода 5 - начальная позиция, а 8 - конечная позиция текста, которую необходимо вычеркнуть, поэтому после выполнения этого кода мы можем получить текст "потребность" с вычеркнутым. Надеюсь, это будет полезно для кого-то еще.

Ответ 14

создать рисовать

<?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>

и использовать его в качестве переднего плана.
android:foreground="@drawable/strike_through"

Ответ 15

Вот расширение для всех вас, 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()
}

использование

textView.showStrikeThrough(true)

Ограничения

  • Зачеркивание может быть только того же цвета, что и текст

Ответ 16

Я сделал это на обычном (локальном) TextView, и он должен работать на удаленном многообразии, так как docs перечисляют метод как эквивалент между двумя:

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