Поиск по этому блогу

пятница, 10 октября 2014 г.

Как поменять весь шрифт в приложении

Извините народ что я так долго ничего не писал, да и времени не было как-то, да и интересного что написать тоже не было, все с чем работал можно с легкостью найти в интернете, но вот сегодня чего-то сложилось так что такую задачу найти сразу не смог, по этому хочу поделиться реализацией этого вопроса.

И так постала значит передо мной задача запендюрить шрифт на всю аппу один, а я до этого делал только под определенные текствьюхи шрифты, а проект здоровый, около 20 экранов, у каждого еще есть по одному \ два диалога в которых тоже нужно изменить шрифт, в общем жуть. Ну я подумал что делать для каждого TextView отдельный TypeFace и прикручивать его к TextView глупо, поэтому начал искать как сделать так что бы сразу одним махом и все элементы с текстом перевести на мой шрифт, и знаете, нашел пару решений, но они оказались не рабочими или очень сложными, а так как я не люблю сложный код я решил что надо что-то по проще и легче в усвоении.

В общем смотрите что получилось в итоге.


Нам нужно создать класс утилиту которая будет создавать TypeFace и конвертировать все вьюхи в нужный нам шрифт, вот как он будет выглядеть:

import android.content.Context;
import android.graphics.Typeface;
import android.util.Log;
import java.lang.reflect.Field;

public class TypefaceUtil {
    public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) {
        try {
            final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets);
            final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride);
            defaultFontTypefaceField.setAccessible(true);
            defaultFontTypefaceField.set(null, customFontTypeface);
        } catch (Exception e) {
            Log.e("Can not set custom font " + customFontFileNameInAssets + " instead of " + defaultFontNameToOverride);
        }
    }
}


Далее нам нужно создать класс наследника Application в котором мы переопределим класс TypeFaceUtils для того что бы можно было охватить всю программу, это мы сделаем таким образом:

public class MyApp extends Application {
    @Override
    public void onCreate() {
          TypefaceUtil.overrideFont(getApplicationContext(), "SERIF", "fonts/Roboto-Regular.ttf");
    }
}


Ну а дальше нам осталось только в файле style.xml добавить строку которая будет назначать шрифт на все элементы дисигна приложения.
<?xml version=«1.0» encoding=«utf-8»?>

<resources>
<style name="AppTheme" parent="@android:style/Theme.Holo.Light">
<item name="android:typeface">serif</item>
</style>
</resources>


AppTheme — это обычно в стандартном файле style.xml наследник AppBaseTheme. 
А теперь осталось скомпилировать приложение и вы увидите как изменился шрифт в нем.