створення перекресленого тексту?


128

Чи можу я створити перекреслений текст в Android, я маю на увазі додавання спеціального значення в TextViewтег, який може зробити це можливим?

<TextView
    android:id="@+id/title" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:textColor="#040404"
    android:typeface="sans" 
    android:textSize="12dip"
    android:textStyle="bold"/>


перевірте тут stackoverflow.com/a/45186622/835883
j2emanue

Відповіді:


311

Фарба.STRIKE_THRU_TEXT_FLAG

TextView someTextView = (TextView) findViewById(R.id.some_text_view);
someTextView.setText(someString);
someTextView.setPaintFlags(someTextView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

Для малювання тексту є кілька бітових прапорців для виконання таких речей, як напівжирний шрифт, курсив та закреслення. Отже, щоб увімкнути закреслення, потрібно перевернути біт, який відповідає цьому прапору. Найпростіший спосіб зробити це - скористатися побітом - або на поточних прапорах та константи, яка відповідає набору прапорів із увімкненим лише закресленим прапором.

Редагувати від Коментаря по Ε Г І І Про І :

Для кожного, хто хоче видалити цей прапор, ось що:

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

2
це справді працює, але чи можу я змінити його властивості, я маю на увазі його розмір, його колір щось подібне
nawfal cuteberg

122
Для кожного, хто хоче зняти цей прапор, ось так:someTextView.setPaintFlags(someTextView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
Ε Г І І І О

1
@ ΕГИІІО що означає символ ~?
Катети Матьє

2
@BobbyJackson, це оператор одинарного розрядного доповнення.
Ε Г І І І О

3
@ ΕГІІІО повертає всі біти. тож скажімо, що strike_thru - 00100, тоді ~ робить 11011. Якщо ви & то з існуючими прапорами, він збереже всі оригінальні прапори, але скасує біт strike_thru
хлопчик

32

Це дуже просто, якщо ви використовуєте рядки:

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

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

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

це не відображається як прорив у редакторі інтерфейсу, але він вражає текст на пристрої
yarell

1
Це може (і, швидше за все, не вдасться) в API 21+
Мартин Маркончіні

Ця відповідь має 3 роки. Я не впевнений, чи потрібно редагувати відповіді, пояснюючи, до чого корисні API чи версія. Якщо в stackoverflow є якесь правило, яке принаймні його рекомендувало, я це зроблю без проблем.
Ігнасіо Алорре

3
Це працювало на кожному рівні API, на якому я тестувався (тестовано 15, 25 та 27)
Ренді

Деякі пристрої не вшановують подібні речі чи підкреслення
Джеймс Ріордан

26

Якщо ви використовуєте Kotlin:

your_text_view.apply {
    paintFlags = paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
    text = "Striked thru text"
}

5
І щоб скасувати це:paintFlags = paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
повторити

25

Це можна зробити трьома способами, встановивши передній план TextViewабо встановивши PaintFlagабо оголосивши рядок як <strike>your_string</strike>в strings.xml. Наприклад,

Через PaintFlag

Це найпростіший метод, для якого потрібно просто встановити перекреслений прапор у TextView як,

yourTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG);

він буде проходити через TextView.

Завдяки малюванню переднього плану (працює лише для API 23+)

Якщо ваш minSdkVersion є API версії 23 +, ви можете перейти через TextView, встановивши передній план як,

<?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="@android:color/holo_red_dark"/>
        </shape>
    </item>
</selector>

Тепер у простому текстовому вікні вам просто потрібно встановити як foreground. Наприклад,

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Your Textview with StrikeThrough"
    android:foreground="@drawable/strikethrough_foreground" />  <!-- this is available above --!>

Через strings.xml

У цьому методі ви повинні оголосити свою строку strings.xmlяк страйк через,

<string name="strike_line"> <strike>This line is strike throughed</strike></string>

Примітка

Але я рекомендую перейти через TextView, встановивши параметр "Dravable". Оскільки за допомогою малювання ви можете легко встановити свій колір лінії (як я встановив червоний колір у наведеному вище прикладі) або розмір або будь-яку іншу властивість стилю. Якщо в інших двох методах колір тексту за замовчуванням є кольором, що перебуває підкреслено.


19

спробуйте це :

richTextView = (TextView)findViewById(R.id.rich_text);  

    // this is the text we'll be operating on  
    SpannableString text = new SpannableString("Lorem ipsum dolor sit amet");  

    text.setSpan(new ForegroundColorSpan(Color.RED), 0, 5, 0);  

    // make "ipsum" (characters 6 to 11) one and a half time bigger than the textbox  
    text.setSpan(new RelativeSizeSpan(1.5f), 6, 11, 0);  

    // make "dolor" (characters 12 to 17) display a toast message when touched  
    final Context context = this;  
    ClickableSpan clickableSpan = new ClickableSpan() {  
        @Override  
        public void onClick(View view) {  
            Toast.makeText(context, "dolor", Toast.LENGTH_LONG).show();  
        }  
    };  
    text.setSpan(clickableSpan, 12, 17, 0);  

    // make "sit" (characters 18 to 21) struck through  
    text.setSpan(new StrikethroughSpan(), 18, 21, 0);  

    // make "amet" (characters 22 to 26) twice as big, green and a link to this site.  
    // it's important to set the color after the URLSpan or the standard  
    // link color will override it.  
    text.setSpan(new RelativeSizeSpan(2f), 22, 26, 0);  
    text.setSpan(new URLSpan("http://www.djsad.com"), 22, 26, 0);  
    text.setSpan(new ForegroundColorSpan(Color.GREEN), 22, 26, 0);  

    // make our ClickableSpans and URLSpans work  
    richTextView.setMovementMethod(LinkMovementMethod.getInstance());  

    // shove our styled text into the TextView          
    richTextView.setText(text, BufferType.SPANNABLE); 

14

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

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

8

Просто використовуйте це, і ви закінчили. Для активності:

TextView t= (TextView).findViewById(R.id.thousand));
t.setPaintFlags(t.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

Для Xml:

<RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/text_view_original_cash_amount"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="5dp"
                android:textColor="@android:color/darker_gray"
                android:text="Rs. 1,999"/>

            <View
                android:layout_width="wrap_content"
                android:layout_height="1dp"
                android:background="@android:color/darker_gray"
                android:layout_centerVertical="true"
                android:layout_alignStart="@id/text_view_original_cash_amount"
                android:layout_alignEnd="@id/text_view_original_cash_amount"
                android:layout_alignLeft="@id/text_view_original_cash_amount"
                android:layout_alignRight="@id/text_view_original_cash_amount" /> 
</RelativeLayout>

Геніальне рішення
Нішант Шах

Але це XMLрішення не надто складне, я маю на увазі для кожного перегляду тексту потрібно додати додатковий відносний макет і вид.
Адітя С.

На даний момент у мене є тільки це рішення, якщо я отримаю інше рішення. Я повинен поділитися з вами.
Ганіша

6

Це добре вписується в прив'язку даних:

@BindingAdapter("strikethrough")
@JvmStatic
fun strikethrough(view: TextView, show: Boolean) {
    view.paintFlags = if (show) {
        view.paintFlags or STRIKE_THRU_TEXT_FLAG
    } else {
        view.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
    }
}

Потім у вашому xml:

    <TextView
        android:id="@+id/line_item_name"
        android:textAppearance="?attr/textAppearanceBody2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Club sandwich with ranch dressing"
        app:strikethrough="@{viewModel.isItemChecked}"/>

3

Я спробував кілька варіантів вище, але це найкраще працює для мене:

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

ура


Вбудований HTML-елемент вкладеного елемента для перекреслення є <strike> або <s> Цей елемент, однак, був застарілий у стандарті HTML 4.01 1999 року та замінений на тег <del>, семантичним елементом, що представляє видалений текст, який агентами користувача (зазвичай веб-браузери) часто відображаються як закреслення. [3] [4] en.wikipedia.org/wiki/Strikethrough Хоча не <del> не <страйк> працює для мене
lxknvlk

0

У вашій моделі перегляду, що спостерігається

fun getStrikeContent(): String {
    return "Hello"
}


 companion object {
    @BindingAdapter("strike")
    @JvmStatic
    fun loadOldPrice(view: TextView, value: String) {
        view.text = value
        view.paintFlags = STRIKE_THRU_TEXT_FLAG
    }
}

то у вашому xml

     <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         app:strike="@{itemViewModel.strikeContent}" />
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.