Custom fonts and XML layouts (Android)

后端 未结 18 2136
执念已碎
执念已碎 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:37

    You can make easily custom textview class :-

    So what you need to do first, make Custom textview class which extended with AppCompatTextView.

    public class CustomTextView extends AppCompatTextView {
        private int mFont = FontUtils.FONTS_NORMAL;
        boolean fontApplied;
    
        public CustomTextView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            init(attrs, context);
        }
    
        public CustomTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(attrs, context);
        }
    
        public CustomTextView(Context context) {
            super(context);
            init(null, context);
        }
    
        protected void init(AttributeSet attrs, Context cxt) {
            if (!fontApplied) {
                if (attrs != null) {
                    mFont = attrs.getAttributeIntValue(
                            "http://schemas.android.com/apk/res-auto", "Lato-Regular.ttf",
                            -1);
                }
                Typeface typeface = getTypeface();
                int typefaceStyle = Typeface.NORMAL;
                if (typeface != null) {
                    typefaceStyle = typeface.getStyle();
                }
                if (mFont > FontUtils.FONTS) {
                    typefaceStyle = mFont;
                }
                FontUtils.applyFont(this, typefaceStyle);
                fontApplied = true;
            }
        }
    }
    

    Now , every time Custom text view call and we will get int value from attribute int fontValue = attrs.getAttributeIntValue("http://schemas.android.com/apk/res-auto","Lato-Regular.ttf",-1).

    Or

    We can also get getTypeface() from view which we set in our xml (android:textStyle="bold|normal|italic"). So do what ever you want to do.

    Now, we make FontUtils for set any .ttf font into our view.

    public class FontUtils {
    
        public static final int FONTS = 1;
        public static final int FONTS_NORMAL = 2;
        public static final int FONTS_BOLD = 3;
        public static final int FONTS_BOLD1 = 4;
    
        private static Map TYPEFACE = new HashMap();
    
        static Typeface getFonts(Context context, String name) {
            Typeface typeface = TYPEFACE.get(name);
            if (typeface == null) {
                typeface = Typeface.createFromAsset(context.getAssets(), name);
                TYPEFACE.put(name, typeface);
            }
            return typeface;
        }
    
        public static void applyFont(TextView tv, int typefaceStyle) {
    
            Context cxt = tv.getContext();
            Typeface typeface;
    
            if(typefaceStyle == Typeface.BOLD_ITALIC) {
                typeface = FontUtils.getFonts(cxt, "FaktPro-Normal.ttf");
            }else if (typefaceStyle == Typeface.BOLD || typefaceStyle == SD_FONTS_BOLD|| typefaceStyle == FONTS_BOLD1) {
                typeface = FontUtils.getFonts(cxt, "FaktPro-SemiBold.ttf");
            } else if (typefaceStyle == Typeface.ITALIC) {
                typeface = FontUtils.getFonts(cxt, "FaktPro-Thin.ttf");
            } else {
                typeface = FontUtils.getFonts(cxt, "FaktPro-Normal.ttf");
            }
            if (typeface != null) {
                tv.setTypeface(typeface);
            }
        }
    }
    

提交回复
热议问题