취소 선 텍스트를 만드시겠습니까?


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
그것은 실제로 작동하지만, 나는 그것의 크기, 그것의 색을 의미하는 그 속성을 바꿀 수
있습니까

122
이 플래그를 제거하려는 사람은 다음과 같습니다.someTextView.setPaintFlags(someTextView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
Ε Г И І И О

1
@ ΕГИІИО ~ 기호는 무엇을 의미합니까?
Mathieu Castets

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 편집기에서 취소 선으로 표시되지 않았지만 장치의 텍스트에
영향을 미칩니다.

1
이것은 (가능성됩니다) 21+ API에 실패 할 수 있습니다
마틴 Marconcini에게

이 답변은 3 년입니다. 어떤 API 또는 버전이 유용한 지 설명 할 때까지 답변을 편집해야하는지 잘 모르겠습니다. 적어도 추천하는 규칙이 stackoverflow에 있다면 문제없이 할 것입니다.
Ignacio Alorre

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()
초에 개정

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>

이제 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를 파업하는 것이 좋습니다. 드로어 블을 통해 취소 선 선 색상 (위의 예에서 빨간색으로 설정 한 것처럼) 또는 크기 또는 기타 스타일 속성을 쉽게 설정할 수 있습니다. 다른 두 가지 방법에서 기본 텍스트 색상은 취소 선 색상입니다.


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> 태그 (일반적으로 사용자 에이전트)로 대체되었습니다. 웹 브라우저)는 종종 취소 선으로 표시됩니다. [3] [4] en.wikipedia.org/wiki/Strikethrough <del>이 아니라 <strike>는 저에게 효과적이지 않습니다
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}" />
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.