取り消し線付きのテキストを作成しますか?


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



回答:


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

テキストをペイントする場合、ボールド、イタリック、および取り消し線などを行うためのいくつかのビットフラグがあります。したがって、取り消し線を有効にするには、このフラグに対応するビットを反転する必要があります。これを行う最も簡単な方法は、ビット単位のORまたは現在のフラグと、取り消し線フラグのみが有効になっているフラグのセットに対応する定数を使用することです。

編集コメントによってΕГИІИО

このフラグを削除したい人のために、これはどのように:

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

2
それは本当に機能しますが、その特性を変更できますか?つまり、そのサイズ、そのような色を意味します
nawfal cuteberg

122
このフラグを削除したい場合は、次のようにします。someTextView.setPaintFlags(someTextView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
ΕГИІИОJul

1
@記号〜はどういう意味ですか?
Mathieu Castets 2013年

2
@BobbyJackson、これは単項ビットごとの補数演算子です。
ΕГИІИО

3
@ΕГИІИОすべてのビットを元に戻します。したがって、strike_thruが00100であるとすると、〜は11011になります。次に&を既存のフラグと一緒に使用すると、元のフラグはすべて保持されますが、strike_thruビットの設定は解除されます
Boy

32

あなたが文字列を使用している場合、それは本当に簡単です:

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

そして、ただ:

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

これは、UIエディターでは取り消し線として表示されませんでしたが、デバイス上のテキストに取り消し線が引かれます
yarell '28

1
これはAPI 21+で失敗する可能性があります(おそらく失敗します)
Martin Marconcini 2017

この回答には3年があります。どのAPIまたはバージョンが役立つかを説明する回答を編集する必要があるかどうかはわかりません。stackoverflowに少なくともそれを推奨するルールがある場合、私は問題なくそれを行います。
Ignacio Alorre 2017

3
これは、私がテストしたすべてのAPIレベルで機能しました(15、25、27でテスト)
Randy

一部のデバイスは、このようなものや下線を尊重しません
James Riordan

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

25

あなたは前景を設定するいずれかの方法で、3通りの方法でこれを行うことができ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>

これで、TextViewで上記のdrawableをとして設定する必要があります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を打ち消すことをお勧めします。ドローアブルを使用すると、取り消し線の色(上記の例で赤い色に設定したように)、サイズ、その他のスタイルプロパティを簡単に設定できます。他の2つの方法では、デフォルトのテキストの色は取り消し線の色です。


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>

独創的な解決策
Nishant Shah

しかし、このXMLソリューションはそれほど複雑ではありません。つまり、テキストビューごとに、相対レイアウトとビューを追加する必要があります。
Aditya S.

今のところ、別の解決策を得た場合、私はこの解決策しか持っていません。私はあなたと共有しなければなりません。
Hanisha

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>ですが、この要素は1999 HTML 4.01標準で非推奨になり、ユーザーエージェント(通常は削除されたテキストを表すセマンティック要素である<del>タグに置き換えられました。 Webブラウザー)は、取り消し線としてレンダリングされることがよくあります。[3] [4] en.wikipedia.org/wiki/Strikethrough <del> not <strike>
not Work

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}" />
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.