Ukuran font string yang berbeda di TextView yang sama

141

Saya memiliki bagian textViewdalam dengan angka (variabel) dan a string, bagaimana saya bisa memberikan nomor satu ukuran lebih besar daripada string? Kode:

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

Saya ingin produk ls.nump memiliki ukuran yang berbeda dari sisa teks. Bagaimana melakukan?

Adriana Carelli
sumber

Jawaban:

360

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

Bidikan jepretan

masukkan deskripsi gambar di sini

Anda dapat memisahkan string menggunakan spasi dan menambahkan rentang ke string yang Anda butuhkan.

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

Sekarang terapkan spanke stringdan tambahkan sama ke textview.

Raghunandan
sumber
pengembalian setSpan (): java.lang.IndexOutOfBoundsException: setSpan (0 ... 5) berakhir melebihi panjang 1. Apa artinya itu?
Adriana Carelli
periksa panjang string. IndexOutOfBoundsException: menunjukkan posisi indeks yang salah untuk awal dan akhir rentang. dalam halo panjang di atas adalah 5 jadi saya menerapkan rentang dari indeks 0 hingga 5
Raghunandan
Bekerja di Google Glass dengan sempurna!
Mohammad Arman
2
apakah ada cara untuk memindahkan karakter yang kecil ke tengah dalam arah vertikal? Pada dasarnya semua karakter harus berada di tengah secara vertikal terlepas dari ukurannya.
500865
Anda mungkin perlu dua tampilan teks dalam kasus itu atau Anda perlu membuat tampilan teks Anda sendiri
Raghunandan
119

Kalau-kalau Anda bertanya-tanya bagaimana Anda bisa mengatur beberapa ukuran yang berbeda dalam tampilan teks yang sama, tetapi menggunakan ukuran absolut dan bukan ukuran relatif, Anda dapat melakukannya menggunakan AbsoluteSizeSpanbukan RelativeSizeSpan.

Hanya dapatkan dimensi dalam piksel dari ukuran teks yang diinginkan

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

dan kemudian buat yang baru AbsoluteSpanberdasarkan teks

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);
Joao Sousa
sumber
Tambahan yang baik dengan AbsoluteSizeSpancontoh
eugeneek
@AmitGarg ingin Anda jelaskan?
Joao Sousa
4
Anda juga dapat menggunakan AbsoluteSizeSpan(sizeInDip, true)untuk menentukan ukuran langsung di dp
Ilia Grabko
8

Anda bisa menyelesaikan ini menggunakan string html dan mengatur html ke Textview menggunakan
txtView.setText(Html.fromHtml("Your html string here"));

Sebagai contoh :

txtView.setText(Html.fromHtml("<html><body><font size=5 color=red>Hello </font> World </body><html>"));`
Remmyabhavan
sumber
1
Kontribusi yang bagus! Tapi fromHtml mulai sekarang (API> = N) sudah usang. Agar ini berfungsi lakukan ini untuk memungkinkan mode kompatibilitas: if (android.os.Build.VERSION.SDK_INT> = android.os.Build.VERSION_CODES.N) {txtView.setText (Html.fromHtml ("string html Anda")) , Html.FROM_HTML_MODE_LEGACY)); } else {txtView.setText (Html.fromHtml ("string html Anda")); }
statosdotcom
Apa satuan "5"? Apakah ini dp? Apakah itu sp? Bagaimana saya bisa mengubahnya ke salah satu dari itu?
pengembang android
5

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

menggunakan

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

masukkan deskripsi gambar di sini

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

menggunakan

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

masukkan deskripsi gambar di sini

Phan Van Linh
sumber
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));

---------------- Hasil ---------------

Hasil:

12345. 24

Anandharaj R
sumber
2

Cara terbaik untuk melakukannya adalah Html tanpa substring teks Anda dan sepenuhnya dinamis Misalnya:

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

    }

dan Anda dapat menggunakan atribut warna dll ... jika pihak lain:

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

Saya telah menulis fungsi saya sendiri yang membutuhkan 2 string dan 1 int (ukuran teks)

Teks lengkap dan bagian teks yang ingin Anda ubah ukurannya.

Ini mengembalikan SpannableStringBuilder yang dapat Anda gunakan dalam tampilan teks.

  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;
    }
Ali Asadi
sumber
0

Jika Anda ingin menghindari terlalu banyak kebingungan untuk penerjemah Anda, saya telah menemukan cara untuk memiliki placeholder dalam string, yang akan ditangani dalam kode.

Jadi, seandainya Anda memiliki ini di string:

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

Dan Anda ingin teks pengganti memiliki ukuran dan warna yang berbeda, Anda dapat menggunakan ini:

        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

Dan hasilnya:

masukkan deskripsi gambar di sini

pengembang android
sumber