ขนาดตัวอักษรที่แตกต่างกันของสตริงใน TextView เดียวกัน


141

ฉันมีtextViewข้างในที่มีตัวเลข (แปรผัน) และ a stringฉันจะให้ขนาดที่ใหญ่กว่าตัวหนึ่งได้stringอย่างไร? รหัส:

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

ฉันต้องการ ls.numproducts มีขนาดแตกต่างจากส่วนที่เหลือของข้อความ วิธีการทำ?

คำตอบ:


360

ใช้ 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); 

ช็อตช็อต

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถแยกสตริงโดยใช้ช่องว่างและเพิ่มการขยายลงในสตริงที่คุณต้องการ

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

ตอนนี้ใช้spanไปและเพิ่มเดียวกันstringtextview


setSpan () return: java.lang.IndexOutOfBoundsException: setSpan (0 ... 5) สิ้นสุดลงเกินความยาว 1 นั่นหมายความว่าอย่างไร
Adriana Carelli

ตรวจสอบความยาวของสตริง IndexOutOfBoundsException: ระบุตำแหน่งดัชนีผิดสำหรับการเริ่มต้นและสิ้นสุดของการขยาย ในความยาวสวัสดีด้านบนคือ 5 ดังนั้นฉันจึงใช้ช่วงจากดัชนี 0 ถึง 5
Raghunandan

ทำงานบน Google Glass ได้อย่างสมบูรณ์แบบ!
Mohammad Arman

2
มีวิธีในการย้ายตัวละครที่มีขนาดเล็กไปยังศูนย์กลางในทิศทางแนวตั้งหรือไม่? โดยพื้นฐานแล้วตัวละครทุกตัวควรอยู่กึ่งกลางแนวตั้งโดยไม่คำนึงถึงขนาด
500865

คุณอาจต้องใช้มุมมองข้อความสองแบบในกรณีนั้นมิฉะนั้นคุณจำเป็นต้องสร้างมุมมองข้อความของคุณเอง
Raghunandan

119

ในกรณีที่คุณกำลังสงสัยว่าคุณสามารถตั้งค่าขนาดแตกต่างกันในหลาย TextView เดียวกัน แต่ใช้ขนาดที่แน่นอนและไม่ได้เป็นญาติหนึ่งคุณสามารถประสบความสำเร็จที่ใช้แทนAbsoluteSizeSpanRelativeSizeSpan

เพิ่งได้มิติเป็นพิกเซลของขนาดตัวอักษรที่ต้องการ

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

จากนั้นสร้างใหม่AbsoluteSpanตามข้อความ

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

นอกจากนี้ยังมีAbsoluteSizeSpanตัวอย่างที่ดี
eugeneek

@AmitGarg คุณต้องการทำอย่างละเอียดหรือไม่
Joao Sousa

4
คุณสามารถใช้AbsoluteSizeSpan(sizeInDip, true)เพื่อระบุขนาดได้โดยตรงใน dp
Ilia Grabko

8

คุณสามารถทำได้โดยใช้สตริง html และตั้งค่า html เป็น Textview โดยใช้
txtView.setText(Html.fromHtml("Your html string here"));

ตัวอย่างเช่น :

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

1
มีส่วนร่วมที่ดี! แต่ fromHtml นับจากนี้ไป (API> = N) เลิกใช้แล้ว สำหรับสิ่งนี้ในการทำงานให้ทำเช่นนี้เพื่ออนุญาตโหมดความเข้ากันได้: if (android.os.Build.VERSION.SDK_INT> = android.os.Build.VERSION_CODES.N) {txtView.setText (Html.fromHtml ("สตริง html ของคุณ")) , Html.FROM_HTML_MODE_LEGACY)); } else {txtView.setText (Html.fromHtml ("สตริง html ของคุณ")); }
statosdotcom

หน่วยของ "5" คืออะไร มันเป็น DP หรือเปล่า? มันคือ sp? ฉันจะเปลี่ยนเป็นรายการใด ๆ ได้อย่างไร
นักพัฒนา android

สีและผลงานในครอบครัวขนาดไม่ทำงาน
c-an

5

วิธีที่ 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);
}

การใช้

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

ป้อนคำอธิบายรูปภาพที่นี่

วิธีที่ 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);
}

การใช้

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

ป้อนคำอธิบายรูปภาพที่นี่


3

ลองspannableStringbuilder ใช้สิ่งนี้เราสามารถสร้างสตริงที่มีขนาดตัวอักษรหลายขนาด


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

---------------- ผลลัพธ์ ---------------

ผลลัพธ์ :

12345 24


2

วิธีที่ดีที่สุดในการทำเช่นนั้นคือ Html โดยไม่ซับสตริงข้อความและไดนามิคทั้งหมดตัวอย่างเช่น:

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

    }

และคุณสามารถใช้สีที่เป็นส่วนประกอบ ฯลฯ ... หากอีกด้านหนึ่ง:

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

1

ฉันได้เขียนฟังก์ชั่นของตัวเองซึ่งใช้ 2 สายและ 1 int (ขนาดตัวอักษร)

ข้อความแบบเต็มและส่วนของข้อความที่คุณต้องการเปลี่ยนขนาดของมัน

มันส่งกลับ SpannableStringBuilder ซึ่งคุณสามารถใช้ในมุมมองข้อความ

  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

ในกรณีที่คุณต้องการหลีกเลี่ยงความสับสนมากเกินไปสำหรับนักแปลของคุณฉันมีวิธีที่จะมีตัวยึดตำแหน่งในสตริงซึ่งจะถูกจัดการในโค้ด

ดังนั้นคุณควรมีสิ่งนี้ในสตริง:

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

และคุณต้องการให้ข้อความตัวยึดมีขนาดและสีแตกต่างกันคุณสามารถใช้สิ่งนี้:

        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

และผลลัพธ์:

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.