Bir uygulama widget'ındaki metne göz atmanın kolay bir yolu var mı?


138

Android'de bir uygulama widget'ında metin vurmanın kolay bir yolu olup olmadığını merak ediyordum. Normal bir aktivitede, metin görüntüleme bayraklarını kullanmak oldukça kolaydır:

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

Ama bir uygulama widget'ında, ben sadece remoteview kullanabilirsiniz ... Bunun mümkün olup olmadığını bilmiyorum

Bununla ilgili bir şey bilen var mı?

Teşekkürler!


Cevabımı burada görün! stackoverflow.com/a/35351523/250260
Jorgesys

xml-onlyBenim gibi bir çözüm istiyorsanız : stackoverflow.com/a/49062515/3579786
Jiyeh

1
yardımcı olabilir ... 6 yolu - Android TextView StrikeThrough
c49

Yanıtlar:


68

Bunu kullanabilirsiniz:

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

Elbette android.graphics.Paint sınıfından başka bayraklar da ekleyebilirsiniz.


8
Bunun nasıl daha fazla oy almadığını bilmiyorum, soruyu mükemmel bir şekilde cevaplıyor. Teşekkürler.
James Cross

İlk olarak, uzaktan görüntülemelerin ne olduğu belirsizdir, ayrıca tüm android sürümleri için çalışmaz.
akshat tailang

Aradığımız cevap bu, androidTextViews üzerinde uygulama widget'ları ile çalışmak sadece removeViews üzerinden erişilebilir. Bu noktada TextView'e doğrudan erişmek mümkün değildir.
endevour

188

Diğer görünümlerde denenmemiş bir metin görünümünde programlı olarak yapmak için >>

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

13
Uygulama Widget'ları için bu mümkün değildir. Yalnızca RemoteViews ile çalışırlar ve boya bayraklarını okumak için bir yöntem yoktur.
Mart'ta Ridcully

78

Programlı olarak yapmanın başka bir yolu, Paint yolundan biraz daha az bir kesmek gibi görünüyor:

Yapmak yerine:

tv.setText(s);

yapmak:

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

Teşekkürler çekicilik gibi çalışır Özellikle üstü çizili çizgi olması için TextView'in bir kısmına ihtiyacınız olduğunda
Diljeet

+1 Spannable ile çözüm çalıştı, çok teşekkür ederim. Günümü kurtardın. Teşekkürler adam;)
Simon Dorociak

Bu şu soruya cevap vermiyor çünkü bu geçerli değilRemoteView
Alex.F

@ Alex.FI, örneğin Bildirimler'de (uzak görünümler) çalıştığı için biraz şaşırdım. Ama AppWidgets ile test etmedim itiraf etmeliyim.
YK

1
Uygulama Widget'ları ile çalışır (ParcelableSpan'ı uygulayan herhangi bir çerçeve aralığı çalışmalıdır)
Karsten

58

2015 Güncellemesi: Millet, bu Android'in çok eski sürümleri için. Modern çözümler için diğer cevaplara bakın!


Metin görünümünün tamamında gezinmek için üstü çizili efekti simüle etmek için belirli bir arka plan resmi kullanabilirsiniz:

android:background="@drawable/bg_strikethrough"

Nerede bg_strikethroughçekilebilir ancak çok dolgu ile iki tarafında büyüyen, ortasından bir düz çizgiyi tutan bir 9-yama, size makul olduğunu düşünüyorum. Ben böyle birini kullandım:

alternatif metin

(netlik için büyütüldü ..% 1300!)

alternatif metin

Bu benim HDPI sürümüm, bu yüzden (ilk http://i.stack.imgur.com/nt6BK.png ) kaydedin res/drawable-hdpi/bg_strikethrough.9.pngve yapılandırma şöyle çalışır:

alternatif metin


ve TextView metinden daha uzunsa ve sadece metnin üzerinden geçilmesi durumunda ne yapmalı?
maysi

sadece siyah ve bir satır metin için ... @ ruhalde benim için çalıştı.
19_16

27

Bunu yapmak için kullanabilirsiniz

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

ve kaldırmak için bunu kullanabilirsiniz

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

1
grev rengini nasıl ekleyebilirim
Harsha

@Harsha bu sadece metnin rengini kullanmanıza izin veriyor gibi görünüyor. Farklı bir üstü çizili renk istiyorsanız, diğer uygulama yöntemlerini denemeniz gerekir.
Michael

19

Tek bir kelimeniz varsa çekilebilir kullanabilirsiniz. Aşağıdaki örnek:

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

birden fazla satırınız varsa aşağıdaki kodu kullanabilirsiniz:

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

@Skizo Sana yardım ettiğine sevindim
Akshay Mukadam

14

İşte hepiniz için bir uzantı Kotlin millet

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

kullanım

textView.showStrikeThrough(true)

sınırlama

Üstü çizili metinler yalnızca metinle aynı renkte olabilir

(örn. Kırmızı metin ve mavi üstü çizili yapılamaz)


9

Çok satırlı TextView için android.text.style.CharacterStyle'ı şu şekilde kullanmalısınız:

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

8

Dizeleri kullanıyorsanız gerçekten kolaydır:

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

Ve sonra sadece:

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

4
@war_Hero Benim için çalıştı, ancak Android Studio'nun oluşturucusunda görüntülenmiyor. Aslında görmek için inşa etmek zorunda kaldı.
Mic Fok

8

Aşağıdaki satırı ekleyin: -

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

"tv" yerine referansınızı kullanın


1
Bu soruya atıfta bulunmuyor, bir AppWidget içindeki RemoteViews nesnesi hakkında soru soruyor.
Matthew

3

bu kodu dene

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

2

Lollipop ve üstü için. çekilebilir oluşturmak

<?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>

ve ön plan olarak kullanabilirsiniz.
android:foreground="@drawable/strike_through"



0

ekleyin:

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

Siz değişkenini ayarlar / eklersiniz:

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

ve daha sonra variableTv dosyasına .setPaintFlags ekleyin:

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

0

Birkaç seçenek denedim, ancak bu benim için en iyisi:

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

şerefe


0

Android kaynakları oldukça iyi HTML biçimlendirme desteğine sahiptir
Aşağıdaki HTML öğeleri desteklenir:

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

Ancak android stüdyo düzenleri önizlemesinde görüntülenmediğini unutmayın. En son Android Studio 3.3.1'de test edildi

Örneğin, Üstü Çizili şöyle görünecektir:

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

-1

Bunu düzenli (yerel) olarak yaptım TextViewve dokümanlar yöntemi ikisi arasında eşdeğer olarak listelediğinden uzak çeşitlilik üzerinde çalışmalıdır:

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


Çalışmıyor :(. Bunu yapıyorum: remoteView.setTextViewText (R.id.text, Html.fromHtml ("<del>" + değer + "</del>"));
Antonio

<del>Tarafından desteklenmiyor olabilir Html.fromHtml(). Denedin mi <strike>ya <s>?
Blrfl

Teşekkürler Blrfl, ama o da çalışmıyor. Html.fromHtml () tarafından yalnızca birkaç HTML etiketinin desteklendiği görülmektedir.
Antonio

Aylak. Üzgünüm yardım edemedim.
Blrfl

teklifler için alışveriş uygulamaları gibi grevle nasıl fiyat elde edebilirim
Harsha

-1

Biliyorum, eski bir soruyu cevaplıyorum, başka biri için, TextView'ın belirli bir bölümünü programlı olarak çıkarmak için yararlı olabilir.

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

Yani, bu örnek kodda, 5 başlangıç ​​pozisyonu ve 8 bitiş metninin sonlandırılmış olması gerekir, bu yüzden bu kodu çalıştırdıktan sonra metnin "dışarı" çarpması ile alabilirsiniz. Umarım başka biri için faydalı olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.