Custom fonts and XML layouts (Android)

后端 未结 18 2265
执念已碎
执念已碎 2020-11-22 07:21

I\'m trying to define a GUI layout using XML files in Android. As far as I can find out, there is no way to specify that your widgets should use a custom font (e.g. one you\

18条回答
  •  半阙折子戏
    2020-11-22 07:24

    There are two ways to customize fonts :

    !!! my custom font in assets/fonts/iran_sans.ttf

    Way 1 : Refrection Typeface.class ||| best way

    call FontsOverride.setDefaultFont() in class extends Application, This code will cause all software fonts to be changed, even Toasts fonts

    AppController.java

    public class AppController extends Application {
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            //Initial Font
            FontsOverride.setDefaultFont(getApplicationContext(), "MONOSPACE", "fonts/iran_sans.ttf");
    
        }
    }
    

    FontsOverride.java

    public class FontsOverride {
    
        public static void setDefaultFont(Context context, String staticTypefaceFieldName, String fontAssetName) {
            final Typeface regular = Typeface.createFromAsset(context.getAssets(), fontAssetName);
            replaceFont(staticTypefaceFieldName, regular);
        }
    
        private static void replaceFont(String staticTypefaceFieldName, final Typeface newTypeface) {
            try {
                final Field staticField = Typeface.class.getDeclaredField(staticTypefaceFieldName);
                staticField.setAccessible(true);
                staticField.set(null, newTypeface);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
    

    Way 2: use setTypeface

    for special view just call setTypeface() to change font.

    CTextView.java

    public class CTextView extends TextView {
    
        public CTextView(Context context) {
            super(context);
            init(context,null);
        }
    
        public CTextView(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
            init(context,attrs);
        }
    
        public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init(context,attrs);
        }
    
        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
            init(context,attrs);
        }
    
        public void init(Context context, @Nullable AttributeSet attrs) {
    
            if (isInEditMode())
                return;
    
            // use setTypeface for change font this view
            setTypeface(FontUtils.getTypeface("fonts/iran_sans.ttf"));
    
        }
    }
    

    FontUtils.java

    public class FontUtils {
    
        private static Hashtable fontCache = new Hashtable<>();
    
        public static Typeface getTypeface(String fontName) {
            Typeface tf = fontCache.get(fontName);
            if (tf == null) {
                try {
                    tf = Typeface.createFromAsset(AppController.getInstance().getApplicationContext().getAssets(), fontName);
                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }
                fontCache.put(fontName, tf);
            }
            return tf;
        }
    
    }
    

提交回复
热议问题