Чи є простий спосіб накреслити текст у віджеті програми?


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.


8
Не знаєте, як це не набрало більше голосів, це чудово відповідає на питання. Дякую.
Джеймс Крос

По-перше, незрозуміло, що таке віддалений перегляд, плюс не працює для всіх версій Android.
akshat tailang

Це відповідь, яку ми шукаємо, робота з віджетами додатків на androidTextViews доступна лише через RemoveView. Наразі доступ до 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);

13
Це неможливо для додатків-віджетів. Вони працюють лише з RemoteViews, і немає способу зчитувати прапори фарби.
Ridcully

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.
BoD

1
Він працює з додатками віджетів (будь-який проміжок рамки, що реалізує ParcelableSpan, повинен працювати)
Карстен,

58

Оновлення 2015 року: Люди, це для дуже старих версій Android. Дивіться інші відповіді на сучасні рішення!


Для перегляду повного перегляду тексту можна використовувати конкретне фонове зображення для імітації ефекту закреслення:

android:background="@drawable/bg_strikethrough"

Там, де bg_strikethroughмалюнок - це 9-латний патрон, який тримає суцільну лінію через середину, зростаючи в обидві сторони, з якою б сильною накладкою ви вважаєте розумною. Я використовував такий, як це:

alt текст

(збільшено для наочності .. 1300%!)

alt текст

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

alt текст


і що робити, якщо 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
Як я можу додати забарвлення кольору
Харша,

@Harsha це, здається, дозволяє лише використовувати колір тексту. Якщо вам потрібен інший яскравий колір, вам доведеться спробувати інший спосіб реалізації.
Майкл

19

Якщо у вас є одне слово, ми можемо використовувати зворотне слово. Наведемо приклад:

<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 Я радий, що це допомогло тобі
Акшай Мукадам,

13

Ось розширення для всіх вас, котлінців

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

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.
Матвій


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

ви встановлюєте / додаєте в змінну You:

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


Це не працює :(. Я роблю це: remoteView.setTextViewText (R.id.text, Html.fromHtml ("<del>" + value + "</del>"));
Антоніо

Можливо, <del>це не підтримується Html.fromHtml(). Ви пробували <strike>чи <s>?
Blrfl

Дякую Blrfl, але це також не працює. Здається, що лише кілька тегів HTML підтримує Html.fromHtml ().
Антоніо

Бампер. Вибачте, що не міг допомогти.
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 - кінцевою, позицію тексту потрібно викреслити, тому після запуску цього коду ми можемо отримати текст "потребу" із закресленим. Сподіваюсь, це допоможе комусь іншому.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.