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!

Antonio
sumber
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
ini dapat membantu ... 6 cara - Android TextView StrikeThrough
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.

agirardello
sumber
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);
ruhalde
sumber
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);
BoD
sumber
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

ohhorob
sumber
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));
pavel
sumber
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)
Akshay Mukadam
sumber
@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)

Michael
sumber
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);
pengguna3768270
sumber
8

Sangat mudah jika Anda menggunakan string:

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

Dan kemudian:

<TextView 
        ...
         android:text="@string/line"
 />
Ignacio Alorre
sumber
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"

ChandraMouli Poreddy
sumber
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>")));
Abhishek c
sumber
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"

Akshay Lebih
sumber
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);
Fay yang cerdik
sumber
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

Milos Simic Simo
sumber
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>
Ilya Gazman
sumber
-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>."));

Blrfl
sumber
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.

Ram Koti
sumber