Android'de TextView aralığının rengini ayarlama


206

Bir TextView içindeki metin aralığının rengini ayarlamak mümkün müdür?

Metnin bir bölümünün mavi olduğu Twitter uygulamasına benzer bir şey yapmak istiyorum. Aşağıdaki resme bakın:

alternatif metin
(kaynak: twimg.com )

Yanıtlar:


430

Başka bir cevap çok benzer olurdu, ancak TextViewiki kez metnin ayarlanması gerekmez

TextView TV = (TextView)findViewById(R.id.mytextview01);

Spannable wordtoSpan = new SpannableString("I know just how to whisper, And I know just how to cry,I know just where to find the answers");        

wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

TV.setText(wordtoSpan);

ancak birden fazla kelimenin rengini nasıl değiştirebilirim?
mostafa hashim

1
@mostafahashim 3 numaralı satırı tekrarlayarak birden çok açıklık oluşturur wordtoSpan.setSpan (yeni ForegroundColorSpan (Color.RED), 50, 80, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Eşref Alshahawy

Kotlin + Spannable String çözümü şu şekilde görünecektir stackoverflow.com/questions/4032676/…
Dmitrii Leonov

81

İşte küçük bir yardım fonksiyonu. Birden fazla diliniz olduğunda harika!

private void setColor(TextView view, String fulltext, String subtext, int color) {
    view.setText(fulltext, TextView.BufferType.SPANNABLE);
    Spannable str = (Spannable) view.getText();
    int i = fulltext.indexOf(subtext);
    str.setSpan(new ForegroundColorSpan(color), i, i + subtext.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}

37

Yeni bir kavramı anlamaya çalışırken görsel örnekleri her zaman yararlı buluyorum.

Arka plan rengi

resim açıklamasını buraya girin

SpannableString spannableString = new SpannableString("Hello World!");
BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(Color.YELLOW);
spannableString.setSpan(backgroundSpan, 0, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);

Ön plan rengi

resim açıklamasını buraya girin

SpannableString spannableString = new SpannableString("Hello World!");
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED);
spannableString.setSpan(foregroundSpan, 0, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);

kombinasyon

resim açıklamasını buraya girin

SpannableString spannableString = new SpannableString("Hello World!");
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED);
BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(Color.YELLOW);
spannableString.setSpan(foregroundSpan, 0, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(backgroundSpan, 3, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);

İlerideki çalışma


29

Daha fazla kontrol istiyorsanız, TextPaintsınıfı kontrol etmek isteyebilirsiniz . İşte nasıl kullanılır:

final ClickableSpan clickableSpan = new ClickableSpan() {
    @Override
    public void onClick(final View textView) {
        //Your onClick code here
    }

    @Override
    public void updateDrawState(final TextPaint textPaint) {
        textPaint.setColor(yourContext.getResources().getColor(R.color.orange));
        textPaint.setUnderlineText(true);
    }
};

getColor (int id) Android 6.0 Marshmallow'da (API 23) kullanımdan kaldırıldı stackoverflow.com/questions/31590714/…
Eka putra

Tıklama Dinleyici ile Güzel Cevap.
Muhaiminur Rahman

20

TextViewMetninizi genişletilebilir olarak ayarlayın ve metniniz ForegroundColorSpaniçin bir tanımlayın .

TextView textView = (TextView)findViewById(R.id.mytextview01);    
Spannable wordtoSpan = new SpannableString("I know just how to whisper, And I know just how to cry,I know just where to find the answers");          
wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
textView.setText(wordtoSpan);

Teşekkürler! Bunu önce TextView'e metin atamadan yapmak mümkün mü?
hpique

Kendimi iyi açıklamadım. Yeniden ifade edeyim. İlk 3 satır gerekli mi? Doğrudan dizeden Spannable nesnesini oluşturamıyor musunuz?
hpique

Hayır, ön plan rengini değiştirmek için TextView öğenizin metnini Arabelleğe Dayalı bir belleğe depolamanız gerekir.
Jorgesys

Renk ile aynı şeyi yapmak istiyorum artı renkli kısım hariç her şeyin kalın olmasını istiyorum, bu kısım italik olmak istiyorum, bunu nasıl yapabilirim?
Lukap

1
açıklıktaki tıklama nasıl ayarlanır?
Rishabh Srivastava

13

Bazı durumlarda kullanılabilecek başka bir yol da, Spannable'ı alan görünümün özelliklerinde bağlantı rengini ayarlamaktır.

Örneğin, Spannable'ınız bir TextView'de kullanılacaksa, XML'de bağlantı rengini şu şekilde ayarlayabilirsiniz:

<TextView
    android:id="@+id/myTextView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColorLink="@color/your_color"
</TextView>

Kodu şu şekilde de kodda ayarlayabilirsiniz:

TextView tv = (TextView) findViewById(R.id.myTextView);
tv.setLinkTextColor(your_color);

5

Spannable'ı oluşturmak için bir fabrika var ve oyuncu kadrosundan kaçının, şöyle:

Spannable span = Spannable.Factory.getInstance().newSpannable("text");

1
SpannableFactory'nin nasıl kullanılacağını açıklığa kavuşturabilir misiniz? "Metin" nasıl görünmelidir?
Piotr

Spannable'ı SpannableFactory tarafından oluşturduktan sonra nasıl kullanılır?
MBH

5

Takım Renk üzerinde Metin tarafından Dize geçen ve renk :

private String getColoredSpanned(String text, String color) {
  String input = "<font color=" + color + ">" + text + "</font>";
  return input;
}

Küme metin üzerinde TextView / Düğme / EditText kodunun altına arayarak vb:

Metin görünümü:

TextView txtView = (TextView)findViewById(R.id.txtView);

Renkli Dize Alın:

String name = getColoredSpanned("Hiren", "#800000");

TextView'da Metin Ayarlama:

txtView.setText(Html.fromHtml(name));

Bitti


4
String text = "I don't like Hasina.";
textView.setText(spannableString(text, 8, 14));

private SpannableString spannableString(String text, int start, int end) {
    SpannableString spannableString = new SpannableString(text);
    ColorStateList redColor = new ColorStateList(new int[][]{new int[]{}}, new int[]{0xffa10901});
    TextAppearanceSpan highlightSpan = new TextAppearanceSpan(null, Typeface.BOLD, -1, redColor, null);

    spannableString.setSpan(highlightSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    spannableString.setSpan(new BackgroundColorSpan(0xFFFCFF48), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    spannableString.setSpan(new RelativeSizeSpan(1.5f), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    return spannableString;
}

Çıktı:

resim açıklamasını buraya girin


ina
Abu Nayem

3

Kabul edilen cevaba eklemek için, tüm cevaplar hakkında konuşulduğu gibi android.graphics.Color sadece : ya istediğim renk tanımlanmışsa res/values/colors.xml?

Örneğin, aşağıdakilerde tanımlanan Malzeme Tasarımı renklerini göz önünde bulundurun colors.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="md_blue_500">#2196F3</color>
</resources>

(android_material_design_colours.xml en iyi arkadaşın)

Ardından, kullanacağınız ContextCompat.getColor(getContext(), R.color.md_blue_500)yeri kullanın Color.BLUE, böylece:

wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

dönüşür:

wordtoSpan.setSpan(new ForegroundColorSpan(ContextCompat.getColor(getContext(), R.color.md_blue_500)), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

Nerede buldum:


2

İşte bunun için bir Kotlin Uzatma İşlevi

    fun TextView.setColouredSpan(word: String, color: Int) {
        val spannableString = SpannableString(text)
        val start = text.indexOf(word)
        val end = text.indexOf(word) + word.length
        try {
            spannableString.setSpan(ForegroundColorSpan(color), start, end,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
            text = spannableString
        } catch (e: IndexOutOfBoundsException) {
         println("'$word' was not not found in TextView text")
    }
}

Metninizi TextView'a böyle ayarladıktan sonra kullanın

private val blueberry by lazy { getColor(R.color.blueberry) }

textViewTip.setColouredSpan("Warning", blueberry)

0
  1. düzeninde metin görünümü oluştur
  2. bu kodu ur MainActivity'ye yapıştır

    TextView textview=(TextView)findViewById(R.id.textviewid);
    Spannable spannable=new SpannableString("Hello my name is sunil");
    spannable.setSpan(new ForegroundColorSpan(Color.BLUE), 0, 5, 
    Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
    textview.setText(spannable);
    //Note:- the 0,5 is the size of colour which u want to give the strring
    //0,5 means it give colour to starting from h and ending with space i.e.(hello), if you want to change size and colour u can easily

0

Aşağıda benim için mükemmel çalışıyor

    tvPrivacyPolicy = (TextView) findViewById(R.id.tvPrivacyPolicy);
    String originalText = (String)tvPrivacyPolicy.getText();
    int startPosition = 15;
    int endPosition = 31;

    SpannableString spannableStr = new SpannableString(originalText);
    UnderlineSpan underlineSpan = new UnderlineSpan();
    spannableStr.setSpan(underlineSpan, startPosition, endPosition, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

    ForegroundColorSpan backgroundColorSpan = new ForegroundColorSpan(Color.BLUE);
    spannableStr.setSpan(backgroundColorSpan, startPosition, endPosition, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

    StyleSpan styleSpanItalic  = new StyleSpan(Typeface.BOLD);

    spannableStr.setSpan(styleSpanItalic, startPosition, endPosition, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

    tvPrivacyPolicy.setText(spannableStr);

Yukarıdaki kod için çıktı

resim açıklamasını buraya girin


0

Buradaki bazı cevaplar güncel değil. Çünkü, (çoğu durumda) bağlantınıza özel bir clic işlemi ekleyeceksiniz .

Ayrıca, dokümantasyon yardımı tarafından sağlandığı gibi, yayılmış dize bağlantı renginiz varsayılan bir renge sahip olacaktır. Msgstr "Varsayılan bağlantı rengi temanın vurgu rengidir veya bu özellik temada tanımlanmışsa android: textColorLink".

İşte bunu güvenli bir şekilde yapmanın yolu.

 private class CustomClickableSpan extends ClickableSpan {

    private int color = -1;

    public CustomClickableSpan(){
        super();
        if(getContext() != null) {
            color = ContextCompat.getColor(getContext(), R.color.colorPrimaryDark);
        }
    }

    @Override
    public void updateDrawState(@NonNull TextPaint ds) {
        ds.setColor(color != -1 ? color : ds.linkColor);
        ds.setUnderlineText(true);
    }

    @Override
    public void onClick(@NonNull View widget) {
    }
}

Sonra kullanmak için.

   String text = "my text with action";
    hideText= new SpannableString(text);
    hideText.setSpan(new CustomClickableSpan(){

        @Override
        public void onClick(@NonNull View widget) {
            // your action here !
        }

    }, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    yourtextview.setText(hideText);
    // don't forget this ! or this will not work !
    yourtextview.setMovementMethod(LinkMovementMethod.getInstance());

Umarım bu yardımcı olacaktır!


0

Geliştirici belgelerinden, bir spannable'ın rengini ve boyutunu değiştirmek için:

1- bir sınıf oluşturun:

    class RelativeSizeColorSpan(size: Float,@ColorInt private val color: Int): RelativeSizeSpan(size) {

    override fun updateDrawState(textPaint: TextPaint?) {
        super.updateDrawState(textPaint)
        textPaint?.color = color
    } 
}

2 Bu sınıfı kullanarak spannable'ınızı oluşturun:

    val spannable = SpannableStringBuilder(titleNames)
spannable.setSpan(
    RelativeSizeColorSpan(1.5f, Color.CYAN), // Increase size by 50%
    titleNames.length - microbe.name.length, // start
    titleNames.length, // end
    Spannable.SPAN_EXCLUSIVE_INCLUSIVE
)
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.