androidspannablestringspanned

How formatted string and then change style by annotations


i have 3 strings localizations

<string name="tests" formatted="true">Test<annotation font="bold"> testBold %1$s</annotation> end</string>
<string name="tests" formatted="true">Тест<annotation font="bold"> тестБолд %1$s</annotation> конец</string>
<string name="tests" formatted="true">Тест<annotation font="bold"> тестБолд %1$s</annotation> кінець</string>

How i can add some argument and modified text by annotation then. The maximum that I get is to do this one thing

CharSequence t = getResources().getString(R.string.tests, "myValue");//in this case i lose my annotation, but set my argument
//OR
CharSequence t = getText(R.string.tests);//in this case i lose my argument but get style BOLD

public SpannableString textFormattingByTags(CharSequence t) {
        SpannedString titleText = new SpannedString(t);
        SpannedString titleText = (SpannedString) getText(R.string.tests);
        Annotation[] annotations = titleText.getSpans(0, titleText.length(), Annotation.class);
        SpannableString spannableString = new SpannableString(titleText);
        for (Annotation annotation : annotations) {
            if (annotation.getKey().equals("font")) {
                String fontName = annotation.getValue();
                if (fontName.equals("bold")) {
                    spannableString.setSpan(new CustomTypefaceSpan("",fontBold),
                            titleText.getSpanStart(annotation),
                            titleText.getSpanEnd(annotation),
                            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                }
            }
        }
        return spannableString;
    }

result in first case i get "Test testBold MyValue end" in second "Test testBold %1$s end". Who had some ideas?


Solution

  • Typeface fontBold = Typeface.createFromAsset(getAssets(), "fonts/Trebuchet_MS_Bold.ttf");
        String s = getResources().getString(R.string.error_date, "20.02.2019", "25.02.2019");
        SpannableStringBuilder spannableString = new SpannableStringBuilder(s);
    
        Integer first1 = null;
        Integer first2 = null;
        Integer last1 = null;
        Integer last2 = null;
        int digits = 0;
        char[] crs = s.toCharArray();
        for (int i = 0; i < crs.length; i++) {
            if (Character.isDigit(crs[i]) && digits != 8) {
                if (first1 == null) {
                    first1 = i;
                }
                last1 = i;
                digits++;
                continue;
            }
            if (Character.isDigit(crs[i])) {
                if (first2 == null) {
                    first2 = i;
                }
                last2 = i;
            }
    
        }
        spannableString.setSpan(new CustomTypefaceSpan("", fontBold), first1, last1 + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        spannableString.setSpan(new CustomTypefaceSpan("", fontBold), first2, last2 + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(getInstance());
        builder.setTitle("test");
        builder.setMessage(spannableString);
        builder.setCancelable(false);
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                getLoaderManager().destroyLoader(LOADER_SOE_BILLING_ID);
            }
        });
        android.support.v7.app.AlertDialog alert = builder.create();
        alert.show();
    

    example