Có cách nào dễ dàng để vượt qua văn bản trong một tiện ích ứng dụng không?


138

Tôi đã tự hỏi nếu có một cách dễ dàng để tấn công văn bản trong một tiện ích ứng dụng trong Android. Trong một hoạt động bình thường, nó khá dễ dàng, sử dụng cờ textview:

textView.setPaintFlags(textView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

Nhưng vì trong một tiện ích ứng dụng, tôi chỉ có thể sử dụng lượt xem từ xa ... Tôi không biết điều này có khả thi không

Bất cứ ai biết điều gì về điều này?

Cảm ơn!


Xem câu trả lời của tôi ở đây! stackoverflow.com/a/35351523/250260
Jorgesys

Nếu bạn muốn xml-onlygiải pháp như tôi: stackoverflow.com/a/49062515/3579786
Jiyeh

1
c49

Câu trả lời:


68

Bạn có thể sử dụng điều này:

remoteviews.setInt(R.id.YourTextView, "setPaintFlags", Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);

Tất nhiên, bạn cũng có thể thêm các cờ khác từ lớp android.graphics.Paint.


8
Không biết làm thế nào điều này không nhận được nhiều phiếu hơn, nó hoàn toàn trả lời câu hỏi. Cảm ơn.
James Cross

Đầu tiên, không rõ lượt xem là gì, cộng với không hoạt động cho tất cả các phiên bản Android.
akshat tailang

Đây là câu trả lời mà chúng tôi đang tìm kiếm, làm việc với các widget ứng dụng trên androidTextViews chỉ có thể truy cập thông qua removeViews. Truy cập TextView trực tiếp là không thể tại thời điểm này.
endevour

188

Để thực hiện theo chương trình trong chế độ xem văn bản, chưa được kiểm tra trong các chế độ xem khác >>

TextView tv = (TextView) findViewById(R.id.mytext);
tv.setText("This is strike-thru");
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

13
Điều này là không thể đối với Widgets ứng dụng. Chúng chỉ hoạt động với RemoteViews và không có phương pháp để đọc cờ sơn.
Vô lý

78

Một cách khác để thực hiện theo lập trình trông giống như một bản hack hơn là cách Paint:

Thay vì làm:

tv.setText(s);

làm:

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

Cảm ơn hoạt động như một bùa mê Đặc biệt khi bạn cần một phần của TextView để có dòng gạch ngang
Diljeet

Giải pháp +1 với Spannable đã hoạt động, cảm ơn bạn rất nhiều. Bạn đã cứu ngày của tôi. Cảm ơn người đàn ông;)
Simon Dorociak

Điều này không trả lời câu hỏi vì điều này không áp dụng choRemoteView
Alex.F

@ Alex.FI hơi ngạc nhiên vì điều này không hoạt động trong Thông báo (là chế độ xem từ xa). Tôi phải thừa nhận rằng tôi chưa thử nghiệm với AppWidgets.
BoD

1
Nó hoạt động với Widgets ứng dụng (bất kỳ khoảng khung nào thực hiện ParcelableSpan sẽ hoạt động)
Karsten

58

Cập nhật 2015: Mọi người, đây là phiên bản Android rất cũ. Xem câu trả lời khác cho các giải pháp hiện đại!


Để vượt qua toàn bộ chế độ xem văn bản, bạn có thể sử dụng một hình ảnh nền cụ thể để mô phỏng hiệu ứng gạch ngang:

android:background="@drawable/bg_strikethrough"

Trong đó bg_strikethroughdrawable là một miếng vá 9 giữ một đường thẳng chắc chắn ở giữa, phát triển hai bên, với nhiều phần đệm mà bạn nghĩ là hợp lý. Tôi đã sử dụng một cái như thế này:

văn bản thay thế

(mở rộng cho rõ ràng .. 1300%!)

văn bản thay thế

Đó là phiên bản HDPI của tôi, vì vậy hãy lưu nó (phiên bản đầu tiên http://i.stack.imgur.com/nt6BK.png ) res/drawable-hdpi/bg_strikethrough.9.pngvà cấu hình sẽ hoạt động như vậy:

văn bản thay thế


và phải làm gì nếu TextView dài hơn văn bản và chỉ có văn bản mới được lướt qua?
maysi

chỉ dành cho văn bản màu đen và một dòng ... @ruhalde làm việc cho tôi.
ahmed_khan_89

27

Để làm điều này, bạn có thể sử dụng

 title.setPaintFlags(title.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

và để loại bỏ bạn có thể sử dụng

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

1
Làm thế nào tôi có thể thêm màu đình công
Harsha

@Harsha điều này dường như chỉ cho phép bạn sử dụng màu của văn bản. Nếu bạn muốn màu khác nhau, bạn phải thử phương pháp thực hiện khác.
Michael

19

Nếu bạn có một từ duy nhất, chúng tôi có thể sử dụng drawable. Sau đây là ví dụ:

<item android:state_pressed="false"><shape android:shape="line">
        <stroke android:width="2dp" android:color="#ffffff" />
    </shape>
</item>

nếu bạn có nhiều dòng bạn có thể sử dụng đoạn mã sau:

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

@Skizo Tôi rất vui vì nó đã giúp bạn
Akshay Mukadam 14/05/2015

13

Đây là một phần mở rộng cho tất cả các bạn

fun TextView.showStrikeThrough(show: Boolean) {
    paintFlags =
            if (show) paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
            else paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
}

Sử dụng

textView.showStrikeThrough(true)

Giới hạn

Chữ nổi chỉ có thể có cùng màu với văn bản

(tức là văn bản màu đỏ và gạch ngang màu xanh là không thể)


9

Đối với TextView đa dòng, bạn nên sử dụng android.text.style.CharacterStyle như thế này:

SpannableString spannable = new SpannableString(text);
spannable.setSpan(new StrikethroughSpan(), 0, text.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
remoteViews.setTextViewText(R.id.itemText, spannable);

8

Nó thực sự dễ dàng nếu bạn đang sử dụng chuỗi:

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

Và sau đó chỉ:

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

4
@war_Hero Làm việc cho tôi, mặc dù không hiển thị trong trình kết xuất của Android Studio. Phải thực sự xây dựng nó để xem nó.
Mic Fok

8

Thêm dòng dưới đây: -

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

sử dụng tài liệu tham khảo của bạn thay vì "tv"


1
Điều này không tham khảo câu hỏi, anh ấy hỏi về một đối tượng RemoteViews trong AppWidget.
Matthew

3

thử mã này

textview.setText((Html.fromHtml("<strike>hello world!</strike>")));

2

Dành cho Lollipop trở lên. tạo ra một 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>

và sử dụng nó như tiền cảnh.
android:foreground="@drawable/strike_through"


0

bạn thêm vào:

TextView variableTv = (TextView) findViewById(R.id.yourText);

bạn đặt / thêm vào biến Bạn:

variableTv.setText("It's Text use Style Strike");

và sau đó thêm .setPaintFlags vào biếnTv:

variableTv.setPaintFlags(variableTv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

0

Tôi đã thử một vài lựa chọn, nhưng điều này tốt nhất cho tôi:

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

chúc mừng


0

Tài nguyên Android có hỗ trợ đánh dấu HTML khá tốt
Các yếu tố HTML dưới đây được hỗ trợ:

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=”…”>

Tuy nhiên, xin lưu ý rằng nó không được hiển thị trong bản xem trước bố cục của studio android. Thử nghiệm lần cuối trên Android Studio 3.3.1

Ví dụ: Strikethrough sẽ trông như thế:

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

-1

Tôi đã thực hiện điều này một cách thường xuyên (cục bộ) TextViewvà nó sẽ hoạt động trên nhiều loại từ xa vì các tài liệu liệt kê phương thức tương đương giữa hai:

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


Nó không hoạt động :(. Tôi đang làm điều này: remoteView.setTextViewText (R.id.text, Html.fromHtml ("<del>" + value + "</ del>"));
Antonio

Nó có thể <del>không được hỗ trợ bởi Html.fromHtml(). Bạn đã thử <strike>hay <s>chưa?
Blrfl

Cảm ơn Blrfl, nhưng nó cũng không hoạt động. Có vẻ như chỉ có một vài thẻ HTML được hỗ trợ bởi Html.fromHtml ().
Antonio

Bummer. Xin lỗi tôi không thể giúp.
Blrfl

Làm thế nào tôi có thể đạt được giá với các cuộc đình công như ứng dụng mua sắm để cung cấp
Harsha

-1

Tôi biết, tôi đang trả lời một câu hỏi cũ, nó có thể hữu ích cho người khác, vì đã đưa ra một phần cụ thể của TextView theo lập trình.

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

Vì vậy, trong mã ví dụ này, 5 là vị trí bắt đầu và 8 là vị trí kết thúc của văn bản cần phải được giải quyết, vì vậy sau khi chạy mã này, chúng ta có thể nhận được văn bản "cần" bị gạch bỏ. Hy vọng nó sẽ hữu ích cho người khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.