Đặt màu của nhịp TextView trong Android


206

Có thể đặt màu của khoảng văn bản trong TextView không?

Tôi muốn làm một cái gì đó tương tự như ứng dụng Twitter, trong đó một phần của văn bản có màu xanh. Xem hình ảnh dưới đây:

văn bản thay thế
(nguồn: twimg.com )

Câu trả lời:


429

Một câu trả lời khác sẽ rất giống nhau, nhưng sẽ không cần phải đặt văn bản của TextViewhai lần

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

nhưng làm thế nào tôi có thể thay đổi màu sắc cho nhiều từ tôi tất cả văn bản không phải là một khoảng?
mostafa hashim

1
@ mostafahashim tạo nhiều nhịp bằng cách lặp lại dòng 3 wordtoSpan.setSpan (new ForegroundColorSpan (Color.RED), 50, 80, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Ashraf Alshahawy

Giải pháp chuỗi Kotlin + Spannable sẽ trông giống như stackoverflow.com/questions /
Dmitrii Leonov

81

Đây là một chức năng giúp đỡ nhỏ. Tuyệt vời khi bạn có nhiều ngôn ngữ!

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

Tôi luôn thấy các ví dụ trực quan hữu ích khi cố gắng hiểu một khái niệm mới.

Màu nền

nhập mô tả hình ảnh ở đây

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

Màu nền

nhập mô tả hình ảnh ở đây

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

Sự phối hợp

nhập mô tả hình ảnh ở đây

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

Học cao hơn


29

Nếu bạn muốn kiểm soát nhiều hơn, bạn có thể muốn kiểm tra TextPaintlớp. Đây là cách sử dụng nó:

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) không dùng nữa trên Android 6.0 Marshmallow (API 23) stackoverflow.com/questions/31590714/iêu
Eka putra

Câu trả lời hay với Click Listener.
Muhaiminur Rahman

20

Đặt TextViewvăn bản của bạn có thể mở rộng và xác định a ForegroundColorSpancho văn bản của bạ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);

Cảm ơn! Có thể làm điều này mà không cần gán văn bản cho TextView trước không?
hpique

Tôi đã không giải thích chính mình. Hãy để tôi nói lại. Là 3 dòng đầu tiên cần thiết? Bạn không thể tạo đối tượng Spannable từ chuỗi trực tiếp?
hpique

Không, bạn phải lưu văn bản của TextView vào Bộ đệm có thể thay đổi màu nền trước.
Jorgesys

Tôi muốn làm điều tương tự với màu sắc cộng với tôi muốn mọi thứ được in đậm trừ phần được tô màu, phần đó tôi muốn là chữ nghiêng, làm thế nào tôi có thể làm điều đó?
Lukap

1
Làm thế nào để thiết lập nhấp trong khoảng?
Rishabh Srivastava

13

Một cách khác có thể được sử dụng trong một số trường hợp là đặt màu liên kết trong các thuộc tính của chế độ xem đang sử dụng Spannable.

Ví dụ, nếu Spannable của bạn sẽ được sử dụng trong TextView, bạn có thể đặt màu liên kết trong XML như thế này:

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

Bạn cũng có thể đặt nó trong mã với:

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

5

Có một nhà máy để tạo ra Spannable và tránh các diễn viên, như thế này:

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

1
Bạn có thể làm rõ cách sử dụng SpannableFactory? "Văn bản" sẽ như thế nào?
Piotr

sau khi tạo Spannable bởi SpannableFactory, vậy làm thế nào để sử dụng nó?
MBH

5

Đặt màu trên văn bản bằng cách chuyển Chuỗimàu :

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

Đặt văn bản trên TextView / Nút / EditText, v.v. bằng cách gọi mã bên dưới:

Xem văn bản:

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

Nhận chuỗi màu:

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

Đặt văn bản trên TextView:

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

Làm xong


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

Đầu ra:

nhập mô tả hình ảnh ở đây


bạn không thích Hasina
Abu Nayem

3

Chỉ để thêm vào câu trả lời được chấp nhận, vì tất cả các câu trả lời dường như chỉ nói về android.graphics.Color: nếu màu tôi muốn được xác định res/values/colors.xmlthì sao?

Ví dụ: xem xét các màu Thiết kế Vật liệu được xác định trong colors.xml:

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

( android_material_design_colours.xmllà bạn thân của bạn)

Sau đó sử dụng ContextCompat.getColor(getContext(), R.color.md_blue_500)nơi bạn sẽ sử dụng Color.BLUE, để:

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

trở thành:

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

Nơi tôi tìm thấy rằng:


2

Đây là một chức năng mở rộng Kotlin tôi có cho việc này

    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")
    }
}

Sử dụng nó sau khi bạn đã đặt văn bản của mình thành TextView như vậy

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

textViewTip.setColouredSpan("Warning", blueberry)

0
  1. tạo textview trong bố cục của bạn
  2. dán mã này vào MainActivity của bạn

    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

Dưới đây hoạt động hoàn hảo cho tôi

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

Đầu ra cho mã trên

nhập mô tả hình ảnh ở đây


0

Một số câu trả lời ở đây không cập nhật. Bởi vì, trong hầu hết các trường hợp , bạn sẽ thêm một hành động clic tùy chỉnh vào liên kết của mình .

Ngoài ra, như được cung cấp bởi tài liệu trợ giúp, màu liên kết chuỗi được kéo dài của bạn sẽ có màu mặc định. "Màu liên kết mặc định là màu nhấn của chủ đề hoặc android: textColorLink nếu thuộc tính này được xác định trong chủ đề".

Đây là cách để làm điều đó một cách an toàn.

 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) {
    }
}

Sau đó để sử dụng nó.

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

Hy vọng điều này sẽ giúp mạnh mẽ!


0

Từ các tài liệu dành cho nhà phát triển, để thay đổi màu sắc và kích thước của một khoảng cách:

1- tạo một lớp:

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

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

2 Tạo spannable của bạn bằng cách sử dụng lớp đó:

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