มีวิธีง่ายๆในการอ่านข้อความในวิดเจ็ตแอพหรือไม่?


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
ไม่ทราบว่าวิธีนี้ไม่ได้รับคะแนนมากขึ้นมันตอบคำถามได้อย่างสมบูรณ์แบบ ขอบคุณ
James Cross

ครั้งแรกมันไม่ชัดเจนว่า remoteviews คืออะไรและไม่สามารถใช้ได้กับ Android ทุกรุ่น
akshat tailang

นี่คือคำตอบที่เรากำลังมองหาการทำงานกับแอพพลิเคชั่นบน 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);

13
App-Widgets ไม่สามารถทำได้ พวกเขาทำงานกับ 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 Solution กับ Spannable ทำงานได้ขอบคุณมาก คุณบันทึกวันของฉัน Thanks man;)
Simon Dorociak

สิ่งนี้ไม่ตอบคำถามเนื่องจากไม่ได้ใช้กับRemoteView
Alex.F

@ Alex.FI รู้สึกประหลาดใจเล็กน้อยเนื่องจากนี่ใช้งานได้เช่นในการแจ้งเตือน (ซึ่งเป็นมุมมองระยะไกล) ฉันต้องยอมรับว่ายังไม่ได้ทดสอบกับ AppWidgets
คณะกรรมการ บริษัท

1
มันทำงานร่วมกับวิดเจ็ตของแอพ (เฟรมเวิร์กใด ๆ ที่ใช้กับ ParcelableSpan ได้)
Karsten

58

อัปเดตปี 2558: ผู้คนจำนวนมากนี่เป็น Android เวอร์ชันเก่า ดูคำตอบอื่น ๆ สำหรับวิธีแก้ปัญหาที่ทันสมัย!


หากต้องการดูทั้งมุมมองข้อความคุณสามารถใช้ภาพพื้นหลังเฉพาะเพื่อจำลองเอฟเฟกต์ขีดทับ

android:background="@drawable/bg_strikethrough"

ในกรณีที่bg_strikethroughdrawable เป็น 9 แพทช์ที่ทำให้เส้นทึบผ่านกลางเติบโตทั้งสองข้างด้วยการขยายตัวมาก แต่คุณคิดว่ามีเหตุผล ฉันเคยใช้อันนี้:

ข้อความแสดงแทน

(ขยายเพื่อความชัดเจน .. 1300%!)

ข้อความแสดงแทน

นั่นคือรุ่น HDPI ของฉันดังนั้นให้บันทึก ( http://i.stack.imgur.com/nt6BK.pngอันแรก) res/drawable-hdpi/bg_strikethrough.9.pngและการตั้งค่าจะทำงานดังนี้:

ข้อความแสดงแทน


และจะทำอย่างไรถ้า TextView นั้นยาวกว่าตัวอักษรและควรมีเพียงตัวอักษรเท่านั้น
maysi

เฉพาะข้อความสีดำและบรรทัดเดียว ... @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

@Harsha ดูเหมือนว่าจะอนุญาตให้คุณใช้สีของข้อความเท่านั้น หากคุณต้องการสีขีดทับที่แตกต่างกันคุณจะต้องลองใช้วิธีการอื่น
Michael

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 ฉันดีใจที่มันช่วยคุณ
Akshay Mukadam

13

นี่คือส่วนขยายสำหรับทุกคนที่ 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)

การ จำกัด

Strikethroughs สามารถมีสีเดียวกับข้อความเท่านั้น

(เช่นตัวอักษรสีแดงและขีดกลางสีน้ำเงินเป็นไปไม่ได้)


9

สำหรับ Multiline 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 ต้องสร้างมันขึ้นมาเพื่อดู
Mic Fok

8

เพิ่มบรรทัดด้านล่าง: -

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

ใช้การอ้างอิงของคุณแทน "ทีวี"


1
สิ่งนี้ไม่ได้อ้างอิงคำถามเขาถามถึงวัตถุ RemoteViews ใน AppWidget
แมทธิว


2

สำหรับ Lollipop ขึ้นไป สร้าง drawable

<?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 ใน variableTv:

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

ตัวอย่างเช่น Strikethrough จะมีลักษณะดังนี้:

<string name="cost"><strike>$10</strike> $5 a month</string>

-1

ฉันได้ทำสิ่งนี้เป็นประจำ (ในพื้นที่) TextViewและควรทำงานกับ remote remote เนื่องจาก docs แสดงรายการวิธีการที่เทียบเท่าระหว่างทั้งสอง:

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


มันไม่ทำงาน :( ฉันกำลังทำสิ่งนี้: remoteView.setTextViewText (R.id.text, Html.fromHtml ("<del>" + ค่า + "</del>"));
Antonio

มันอาจจะเป็นไปได้ว่าจะไม่ได้รับการสนับสนุนโดย<del> Html.fromHtml()มีคุณพยายาม<strike>หรือ<s>?
Blrfl

ขอบคุณ Blrfl แต่มันไม่ทำงานเหมือนกัน ดูเหมือนว่ามีแท็ก HTML เพียงไม่กี่แท็กเท่านั้นที่ถูกแทนที่ด้วย Html.fromHtml ()
Antonio

คนเกียจคร้าน ขอโทษฉันอดไม่ได้
Blrfl

ฉันจะประสบความสำเร็จในด้านราคาด้วยการประท้วงได้อย่างไรเช่นแอปสำหรับช็อปปิ้งเพื่อรับข้อเสนอ
Harsha

-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 คือตำแหน่งสิ้นสุดของข้อความจะต้องถูกระงับดังนั้นหลังจากรันโค้ดนี้เราจะได้รับข้อความ "ต้องการ" โดยการขีดทับ หวังว่ามันจะเป็นประโยชน์สำหรับคนอื่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.