Как правильно установить два разных шрифта в Android Theme - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть приложение для Android с английским и арабским языками в качестве выбора языка.Моя проблема в том, что мне нужно использовать определенный шрифт для каждого языка.

Как правильно реализовать это?

Моя идея состояла в том, чтобы создать две разные темы в styles.xml, напримерthis:

<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 / Каллиграфия для своих пользовательских шрифтов.

1 Ответ

0 голосов
/ 12 декабря 2018

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

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"/>
...