Adakah cara mudah untuk menerobos teks di widget aplikasi?


141

Saya ingin tahu apakah ada cara mudah untuk membuat teks dalam widget aplikasi di Android. Dalam aktivitas normal, cukup mudah, menggunakan flag textview:

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

Tetapi karena dalam widget aplikasi, saya hanya dapat menggunakan tampilan jarak jauh ... Saya tidak tahu apakah ini mungkin

Adakah yang tahu sesuatu tentang ini?

Terima kasih!


Lihat jawaban saya di sini! stackoverflow.com/a/35351523/250260
Jorgesys

Jika Anda menginginkan xml-onlysolusi seperti saya: stackoverflow.com/a/49062515/3579786
Jiyeh

1
c49

Jawaban:


70

Anda dapat menggunakan ini:

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

Tentu saja Anda juga bisa menambahkan tanda lain dari kelas android.graphics.Paint.


8
Tidak tahu bagaimana ini tidak mendapatkan lebih banyak suara, ini menjawab pertanyaan dengan sempurna. Terima kasih.
James Cross

1
Pertama, tidak jelas apa itu tampilan jarak jauh, plus tidak berfungsi untuk semua versi Android.
akshat tailang

Ini adalah jawaban yang kami cari, bekerja dengan app-widgets di androidTextViews hanya dapat diakses melalui removeViews. Mengakses TextView secara langsung tidak dimungkinkan pada saat ini.
endevour

192

Untuk melakukannya secara terprogram dalam textview, belum teruji di view lain >>

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

13
Ini tidak mungkin untuk Widget Aplikasi. Mereka hanya bekerja dengan RemoteViews dan tidak ada metode untuk membaca flag paint.
konyol

79

Cara lain untuk melakukannya secara terprogram yang terlihat sedikit kurang seperti hack daripada cara Paint:

Daripada melakukan:

tv.setText(s);

melakukan:

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

Terima kasih bekerja seperti pesona Khususnya ketika Anda membutuhkan beberapa bagian dari TextView untuk memiliki garis strikethrough
Diljeet

Solusi +1 dengan Spannable berhasil, terima kasih banyak. Anda menyelamatkan hari saya. Thanks man;)
Simon Dorociak

Ini tidak menjawab pertanyaan karena ini tidak berlaku untukRemoteView
Alex. F

@ Alex.FI saya agak terkejut karena ini berfungsi misalnya di Pemberitahuan (yang merupakan tampilan jarak jauh). Saya harus mengakui bahwa saya belum menguji dengan AppWidgets.
BoD

1
Itu berfungsi dengan Widget Aplikasi (rentang kerangka apa pun yang menerapkan ParcelableSpan seharusnya berfungsi)
Karsten

59

Pembaruan 2015: Teman-teman , ini untuk versi Android yang sangat lama. Lihat jawaban lain untuk solusi modern!


Untuk menelusuri seluruh tampilan teks, Anda dapat menggunakan gambar latar belakang tertentu untuk mensimulasikan efek coretan:

android:background="@drawable/bg_strikethrough"

Di mana bg_strikethroughdrawable adalah 9-tambalan yang membuat garis solid di tengah, tumbuh di kedua sisi, dengan banyak bantalan yang menurut Anda masuk akal. Saya telah menggunakan yang seperti ini:

teks alt

(diperbesar untuk kejelasan .. 1300%!)

teks alt

Itu adalah versi HDPI saya, jadi simpan (yang pertama http://i.stack.imgur.com/nt6BK.png ) sebagai res/drawable-hdpi/bg_strikethrough.9.pngdan konfigurasi akan berfungsi seperti ini:

teks alt


dan apa yang harus dilakukan jika TextView lebih panjang dari teks dan hanya teks yang harus ditembus?
May

hanya untuk teks hitam dan satu baris ... @ruhalde berhasil untuk saya.
ahmed_khan_89

28

Untuk melakukan ini, Anda dapat menggunakan ini

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

dan untuk menghapus Anda dapat menggunakan ini

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

1
bagaimana saya bisa menambahkan warna
coretan

@Harsha ini sepertinya hanya mengizinkan Anda untuk menggunakan warna teks. Jika Anda menginginkan warna coretan yang berbeda, Anda harus mencoba metode implementasi lainnya.
Michael

19

Jika Anda memiliki satu kata, kami dapat menggunakan drawable. Berikut contohnya:

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

jika Anda memiliki banyak baris Anda dapat menggunakan kode berikut:

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

@Skizo Saya senang ini membantu Anda
Akshay Mukadam

16

Ini adalah ekstensi untuk kalian semua orang 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()
}

Pemakaian

textView.showStrikeThrough(true)

Keterbatasan

Coretan hanya bisa memiliki warna yang sama dengan teks

(yaitu teks merah dan coretan biru tidak dimungkinkan)


9

Untuk TextView multiline, Anda harus menggunakan android.text.style.CharacterStyle seperti ini:

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

8

Sangat mudah jika Anda menggunakan string:

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

Dan kemudian:

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

4
@war_Hero Bekerja untuk saya, tidak merender di perender Android Studio. Harus benar-benar membangunnya untuk melihatnya.
Mic Fok

8

Tambahkan baris di bawah ini: -

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

gunakan referensi Anda, bukan "tv"


1
Ini tidak mereferensikan pertanyaan, dia menanyakan tentang objek RemoteViews di AppWidget.
Matius

3

coba kode ini

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

2

Untuk Lollipop ke atas. buat 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>

dan menggunakannya sebagai latar depan.
android:foreground="@drawable/strike_through"


ini hanya akan bekerja untuk teks baris tunggal karena bergantung pada Tampilan
Billy

0

Anda menambahkan:

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

Anda mengatur / menambahkan variabel Anda:

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

lalu tambahkan .setPaintFlags di variableTv:

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

0

Saya mencoba beberapa opsi tetapi, ini bekerja paling baik untuk saya:

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

Bersulang


0

Sumber daya Android memiliki dukungan markup HTML yang cukup baik
. Elemen HTML di bawah ini didukung:

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

Namun perlu diperhatikan bahwa itu tidak dirender di pratinjau tata letak studio android. Terakhir diuji di Android Studio 3.3.1

Misalnya, Coret akan terlihat seperti itu:

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

-1

Saya telah melakukan ini pada reguler (lokal) TextView, dan itu harus bekerja pada variasi jarak jauh karena dokumen mencantumkan metode yang setara antara keduanya:

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


Tidak bekerja :(. Saya melakukan ini: remoteView.setTextViewText (R.id.text, Html.fromHtml ("<del>" + value + "</del>"));
Antonio

Mungkin itu <del>tidak didukung oleh Html.fromHtml(). Sudahkah Anda mencoba <strike>atau <s>?
Blrfl

Terima kasih Blrfl, tetapi tidak berhasil. Tampaknya hanya beberapa tag HTML yang didukung oleh Html.fromHtml ().
Antonio

Kekecewaan. Maaf saya tidak bisa membantu.
Blrfl

bagaimana saya bisa mencapai harga dengan mogok seperti aplikasi belanja untuk penawaran
Harsha

-1

Saya tahu, saya menjawab pertanyaan lama, mungkin berguna untuk orang lain, karena mencoret bagian tertentu dari TextView secara terprogram.

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

Jadi, pada kode contoh ini, 5 adalah posisi awal dan 8 adalah posisi akhir teks perlu dicoret, jadi setelah menjalankan kode ini kita bisa mendapatkan teks "perlu" dengan dicoret. Semoga bermanfaat bagi orang lain.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.