Kích thước phông chữ khác nhau của các chuỗi trong cùng một TextView


141

Tôi có một textViewbên trong với một số (biến) và a string, làm thế nào tôi có thể cho kích thước số một lớn hơn string? mật mã:

TextView size = (TextView)convertView.findViewById(R.id.privarea_list_size);
if (ls.numProducts != null) {
    size.setText(ls.numProducts + " " + mContext.getString(R.string.products));
}

Tôi muốn ls.numproducts có kích thước khác với phần còn lại của văn bản. Làm thế nào để làm gì?

Câu trả lời:


360

Sử dụng một Spannable String

 String s= "Hello Everyone";
 SpannableString ss1=  new SpannableString(s);
 ss1.setSpan(new RelativeSizeSpan(2f), 0,5, 0); // set size
 ss1.setSpan(new ForegroundColorSpan(Color.RED), 0, 5, 0);// set color
 TextView tv= (TextView) findViewById(R.id.textview);
 tv.setText(ss1); 

Chụp nhanh

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

Bạn có thể phân tách chuỗi bằng cách sử dụng khoảng trắng và thêm span vào chuỗi bạn yêu cầu.

 String s= "Hello Everyone";  
 String[] each = s.split(" ");

Bây giờ áp dụng spancho stringvà thêm tương tự textview.


setSpan () return: java.lang.IndexOutOfBoundException: setSpan (0 ... 5) kết thúc vượt quá độ dài 1. Điều đó có nghĩa là gì?
Adriana Carelli

kiểm tra độ dài của chuỗi. IndexOutOfBoundException: chỉ vị trí chỉ mục sai cho bắt đầu và kết thúc nhịp. trong độ dài Hello ở trên là 5 vì vậy tôi đã áp dụng khoảng từ chỉ số 0 đến 5
Raghunandan

Hoạt động hoàn hảo trên Google Glass!
Mohammad Arman

2
Có cách nào để di chuyển các ký tự nhỏ đến trung tâm theo hướng dọc không? Về cơ bản tất cả các ký tự nên được căn giữa theo chiều dọc bất kể kích thước.
500865

Bạn có thể cần hai chế độ xem văn bản trong trường hợp đó hoặc nếu không bạn cần phải thực hiện chế độ xem văn bản của riêng mình
Raghunandan

119

Chỉ trong trường hợp bạn đang tự hỏi làm thế nào bạn có thể đặt nhiều kích thước khác nhau trong cùng một chế độ xem văn bản, nhưng sử dụng kích thước tuyệt đối và không phải là kích thước tương đối, bạn có thể đạt được điều đó bằng cách sử dụng AbsoluteSizeSpanthay vì a RelativeSizeSpan.

Chỉ cần lấy kích thước tính bằng pixel của kích thước văn bản mong muốn

int textSize1 = getResources().getDimensionPixelSize(R.dimen.text_size_1);
int textSize2 = getResources().getDimensionPixelSize(R.dimen.text_size_2);

và sau đó tạo một cái mới AbsoluteSpandựa trên văn bản

String text1 = "Hi";
String text2 = "there";

SpannableString span1 = new SpannableString(text1);
span1.setSpan(new AbsoluteSizeSpan(textSize1), 0, text1.length(), SPAN_INCLUSIVE_INCLUSIVE);

SpannableString span2 = new SpannableString(text2);
span2.setSpan(new AbsoluteSizeSpan(textSize2), 0, text2.length(), SPAN_INCLUSIVE_INCLUSIVE);

// let's put both spans together with a separator and all
CharSequence finalText = TextUtils.concat(span1, " ", span2);

Bổ sung tốt với AbsoluteSizeSpanví dụ
eugeneek

@AmitGarg bạn có muốn giải thích không?
Joao Sousa

4
Bạn cũng có thể sử dụng AbsoluteSizeSpan(sizeInDip, true)để chỉ định kích thước trực tiếp trong dp
Ilia Grabko

8

Bạn có thể hoàn thành việc này bằng chuỗi html và đặt html thành Textview bằng cách sử dụng
txtView.setText(Html.fromHtml("Your html string here"));

Ví dụ :

txtView.setText(Html.fromHtml("<html><body><font size=5 color=red>Hello </font> World </body><html>"));`

1
Đóng góp tốt đẹp! Nhưng từ giờ trở đi (API> = N) không được chấp nhận. Để làm việc này, hãy làm điều này để cho phép chế độ tương thích: if (android.os.Build.VERSION.SDK_INT> = android.os.Build.VERSION_CODES.N) {txtView.setText (Html.fromHtml ("chuỗi html của bạn")) , Html.FROM cưới_MODE_LEGACY)); } other {txtView.setText (Html.fromHtml ("chuỗi html của bạn")); }
statosdotcom

Đơn vị của "5" là gì? Có phải là dp không? Có phải là sp không? Làm thế nào tôi có thể thay đổi nó thành bất kỳ trong số đó?
nhà phát triển Android

5

Phương pháp 1

public static void increaseFontSizeForPath(Spannable spannable, String path, float increaseTime) {
    int startIndexOfPath = spannable.toString().indexOf(path);
    spannable.setSpan(new RelativeSizeSpan(increaseTime), startIndexOfPath,
            startIndexOfPath + path.length(), 0);
}

sử dụng

Utils.increaseFontSizeForPath(spannable, "big", 3); // make "big" text bigger 3 time than normal text

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

Cách 2

public static void setFontSizeForPath(Spannable spannable, String path, int fontSizeInPixel) {
    int startIndexOfPath = spannable.toString().indexOf(path);
    spannable.setSpan(new AbsoluteSizeSpan(fontSizeInPixel), startIndexOfPath,
            startIndexOfPath + path.length(), 0);
}

sử dụng

Utils.setFontSizeForPath(spannable, "big", (int) textView.getTextSize() + 20); // make "big" text bigger 20px than normal text

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



3
private SpannableStringBuilder SpannableStringBuilder(final String text, final char afterChar, final float reduceBy) {
        RelativeSizeSpan smallSizeText = new RelativeSizeSpan(reduceBy);
        SpannableStringBuilder ssBuilder = new SpannableStringBuilder(text);
        ssBuilder.setSpan(
                smallSizeText,
                text.indexOf(afterChar),
                text.length(),
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
        );

        return ssBuilder;
    }
------------------------
TextView textView =view.findViewById(R.id.textview);
String s= "123456.24";
textView.setText(SpannableStringBuilder(s, '.', 0.7f));

---------------- Kết quả ---------------

Kết quả :

12345. 24


2

Cách tốt nhất để làm điều đó là Html không có chuỗi con văn bản của bạn và hoàn toàn tự động Ví dụ:

  public static String getTextSize(String text,int size) {
         return "<span style=\"size:"+size+"\" >"+text+"</span>";

    }

và bạn có thể sử dụng màu do vv ... nếu mặt khác:

size.setText(Html.fromHtml(getTextSize(ls.numProducts,100) + " " + mContext.getString(R.string.products));  

1

Tôi đã viết hàm riêng của mình trong đó có 2 chuỗi và 1 int (kích thước văn bản)

Toàn văn và một phần của văn bản bạn muốn thay đổi kích thước của nó.

Nó trả về một SpannableStringBuilder mà bạn có thể sử dụng nó trong chế độ xem văn bản.

  public static SpannableStringBuilder setSectionOfTextSize(String text, String textToChangeSize, int size){

        SpannableStringBuilder builder=new SpannableStringBuilder();

        if(textToChangeSize.length() > 0 && !textToChangeSize.trim().equals("")){

            //for counting start/end indexes
            String testText = text.toLowerCase(Locale.US);
            String testTextToBold = textToChangeSize.toLowerCase(Locale.US);
            int startingIndex = testText.indexOf(testTextToBold);
            int endingIndex = startingIndex + testTextToBold.length();
            //for counting start/end indexes

            if(startingIndex < 0 || endingIndex <0){
                return builder.append(text);
            }
            else if(startingIndex >= 0 && endingIndex >=0){

                builder.append(text);
                builder.setSpan(new AbsoluteSizeSpan(size, true), startingIndex, endingIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }else{
            return builder.append(text);
        }

        return builder;
    }

0

Trong trường hợp bạn muốn tránh quá nhiều sự nhầm lẫn cho các dịch giả của mình, tôi đã nghĩ ra một cách để chỉ có một trình giữ chỗ trong chuỗi, sẽ được xử lý theo mã.

Vì vậy, giả sử bạn có chuỗi này trong chuỗi:

    <string name="test">
        <![CDATA[
        We found %1$s items]]>
    </string>

Và bạn muốn văn bản giữ chỗ có kích thước và màu sắc khác nhau, bạn có thể sử dụng điều này:

        val textToPutAsPlaceHolder = "123"
        val formattedStr = getString(R.string.test, "$textToPutAsPlaceHolder<bc/>")
        val placeHolderTextSize = resources.getDimensionPixelSize(R.dimen.some_text_size)
        val placeHolderTextColor = ContextCompat.getColor(this, R.color.design_default_color_primary_dark)
        val textToShow = HtmlCompat.fromHtml(formattedStr, HtmlCompat.FROM_HTML_MODE_LEGACY, null, object : Html.TagHandler {
            var start = 0
            override fun handleTag(opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader) {
                when (tag) {
                    "bc" -> if (!opening) start = output.length - textToPutAsPlaceHolder.length
                    "html" -> if (!opening) {
                        output.setSpan(AbsoluteSizeSpan(placeHolderTextSize), start, start + textToPutAsPlaceHolder.length, 0)
                        output.setSpan(ForegroundColorSpan(placeHolderTextColor), start, start + textToPutAsPlaceHolder.length, 0)
                    }
                }
            }
        })
        textView.text = textToShow

Và kết quả:

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

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.