Как правилно да зададете два различни шрифта в Android Theme

Имам приложение за Android с английски и арабски като избираеми езици. Проблемът ми е, че трябва да използвам конкретен шрифт за всеки език.

Какъв е правилният начин за прилагане на това?

Идеята ми беше да създам две различни теми в styles.xml, като тази:

<resources>

    <!-- English application theme. -->
    <style name="EnglishTheme" parent="Theme.AppCompat.Light.NoActionBar">
        ... all my others attributes ...

        <item name="pathBoldFont">fonts/FontEnglish-Bold.ttf</item>
        <item name="pathRegularFont">fonts/FontEnglish-Regular.ttf</item>
        <item name="pathThinFont">fonts/FontEnglish-Thin.ttf</item>
    </style>

    <!-- Arabic application theme. -->
    <style name="ArabicTheme" parent="Theme.AppCompat.Light.NoActionBar">
        ... all my others attributes ...

        <item name="pathBoldFont">fonts/FontArabic-Bold.ttf</item>
        <item name="pathRegularFont">fonts/FontArabic-Regular.ttf</item>
        <item name="pathThinFont">fonts/FontArabic-Thin.ttf</item>
    </style>

</resources>

По време на изпълнение на приложението проверявам локала на потребителя и зареждам правилната тема. Но очевидно това не е много СУХО, защото трябва да пиша два пъти всеки друг атрибут на темата.

Четох, че това не е възможно да се актуализират програмно атрибути на тема (само шрифтове в моя случай), така че какво би могло да бъде по-добро решение?

За информация използвам InflationX/Calligraphy за персонализираните си шрифтове.


person Zat42    schedule 12.12.2018    source източник


Отговори (1)


просто създайте персонализиран TextView Class, където задавате вашите шрифтове и там, когато получите шрифт, проверявате за избрания език

public class CustomTextView extends android.support.v7.widget.AppCompatTextView {
    public CustomTextView (Context context) {
        super(context);
    }

    public CustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray a = context.getTheme().obtainStyledAttributes(
                attrs,
                R.styleable.CustomTextView,
                0, 0);

        try {
            int custom_font = a.getInt(R.styleable.CustomTextView_custom_font, 0);

            switch (custom_font) {
            //Regular    
            case 0:
                    if(language == "english")
                    setTypeface(/*return Typeface Regular for english*/);
                    else setTypeface(/*return Typeface Regular  for arabic*/);
                    break;
                //Bold
                case 1:
                    if(language == "english")
                    setTypeface(/*return Typeface Boldfor english*/);
                    else setTypeface(/*return Typeface Boldfor arabic*/);
                    break;

            }

        } finally {
            a.recycle();
        }
    }

    public CustomTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

}

и във вашия attr.xml

<declare-styleable name="CustomTextView">
    <attr name="custom_font" format="string">
        <enum name="regular" value="0" />
        <enum name="bold" value="1" />
    </attr>
</declare-styleable>

Използвайте го така

        <CustomTextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         app:custom_font="bold"/>
person Master Fathi    schedule 12.12.2018