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

138

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

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

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

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

Спасибо!

Антонио
источник
Смотрите мой ответ здесь! stackoverflow.com/a/35351523/250260
Jorgesys
Если вы хотите xml-onlyрешения, как я: stackoverflow.com/a/49062515/3579786
Jiyeh
1
это может помочь ... 6 способов - Android TextView StrikeThrough
c49

Ответы:

68

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

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

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

agirardello
источник
8
Не знаю, как это не набирает больше голосов, это прекрасно отвечает на вопрос. Спасибо.
Джеймс Кросс
Во-первых, неясно, что такое удаленные просмотры, плюс не работает для всех версий Android.
Акшат Таианг
Это ответ, который мы ищем, работа с виджетами приложений в androidTextViews доступна только через removeViews. Прямой доступ к TextView на данный момент невозможен.
endevour
188

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

TextView tv = (TextView) findViewById(R.id.mytext);
tv.setText("This is strike-thru");
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
ruhalde
источник
13
Это невозможно для App-Widgets. Они работают только с RemoteViews, и нет способа прочитать флаги рисования.
Чудесно
78

Еще один способ сделать это программно, который выглядит немного менее как хак, чем способ 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);
Совет директоров
источник
Спасибо работает как очарование. Особенно, когда вам нужна какая-то часть TextView для зачеркивания
Diljeet
+1 Решение с Spannable сработало, спасибо большое. Ты спас мой день. Спасибо, мужчина;)
Симон Дороцяк
Это не отвечает на вопрос, поскольку это не относится кRemoteView
Alex.F
@ Alex.FI немного удивлен, так как это работает, например, в уведомлениях (которые являются удаленными представлениями). Я должен признать, что я не проверял с AppWidgets все же.
СД
1
Он работает с виджетами приложений (любой фреймворк, который реализует ParcelableSpan, должен работать)
Карстен
58

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


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

android:background="@drawable/bg_strikethrough"

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

альтернативный текст

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

альтернативный текст

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

альтернативный текст

ohhorob
источник
и что делать, если TextView длиннее текста и только текст должен быть зачеркнут?
Май
только для черного и однострочного текста ... @ruhalde работал для меня.
ahmed_khan_89
27

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

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

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

 title.setPaintFlags(title.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
павел
источник
1
Как я могу добавить цвет страйк
Харша
@ Харша, похоже, это позволяет вам использовать цвет текста. Если вам нужен другой зачеркнутый цвет, вам придется попробовать другой метод реализации.
Майкл
19

Если у вас есть одно слово, мы можем использовать 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)
Акшай Мукадам
источник
@Skizo Я рад, что это помогло тебе
Акшай Мукадам
14

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

ограничение

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

(т.е. красный текст и синяя зачеркивание невозможны)

Майкл
источник
9

Для многострочного 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);
user3768270
источник
8

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

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

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

<TextView 
        ...
         android:text="@string/line"
 />
Игнасио Алорре
источник
4
@war_Hero Работал для меня, но не рендеринг в Android Studio, хотя. Пришлось на самом деле построить его, чтобы увидеть это.
Мик Фок
8

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

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

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

ЧандраМули Поредди
источник
1
Это не относится к вопросу, он спрашивает об объекте RemoteViews в AppWidget.
Мэтью
3

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

textview.setText((Html.fromHtml("<strike>hello world!</strike>")));
Абхишек с
источник
2

Для леденцов и выше. создать рисовать

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

Акшай Море
источник
это будет работать только для однострочных текстов, так как это зависит от вида
Билли
0

Вы добавляете в:

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

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

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

и затем добавьте .setPaintFlags в переменную TV:

variableTv.setPaintFlags(variableTv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
Брилиант Фэй
источник
0

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

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

ура

Милош Симич Симо
источник
0

Ресурсы Android имеют довольно хорошую поддержку HTML-разметки. Поддерживаются следующие
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=”…”>

Однако обратите внимание, что он не отображается в предварительном просмотре макетов Android. Последняя проверка на Android Studio 3.3.1

Например, зачеркивание будет выглядеть так:

<string name="cost"><strike>$10</strike> $5 a month</string>
Илья Газман
источник
-1

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

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

Blrfl
источник
Это не работает :(. Я делаю это: remoteView.setTextViewText (R.id.text, Html.fromHtml ("<del>" + value + "</ del>"));
Антонио
Может быть , что <del>не поддерживается Html.fromHtml(). Вы пробовали <strike>или <s>?
Blrfl
Спасибо Blrfl, но он тоже не работает. Кажется, что Html.fromHtml () поддерживает только несколько HTML-тегов.
Антонио
Облом. Извините, я не мог помочь.
Blrfl
Как я могу добиться за цену с забастовкой, как покупки приложений для предложений
Харша
-1

Я знаю, я отвечаю на старый вопрос, это может быть полезно для кого-то другого, для того, чтобы вычеркнуть определенную часть 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 - конечная позиция текста, которую необходимо вычеркнуть, поэтому после выполнения этого кода мы можем получить текст «потребность» с вычеркнутым. Надеюсь, это будет полезно для кого-то еще.

Рам Коти
источник