Custom TrueType font from xml only

前端 未结 1 909
轮回少年
轮回少年 2021-01-01 06:00

Is there any way to pass custom font for TextView (or subclasses of it) using only xml without providing any java code like this

Typeface tf = Typeface.creat         


        
1条回答
  •  旧时难觅i
    2021-01-01 06:46

    It is not possible to do it purely from XML, but you can create a custom view and reference that from XML. This way you will only need to write the code once, allowing you to recycle it in various layouts.

    For instance, declare the class FontTextView:

    package com.example;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.widget.TextView;
    
    public class FontTextView extends TextView {
    
        /** 
         *  Note that when generating the class from code, you will need
         *  to call setCustomFont() manually.
         */
        public FontTextView(Context context) {
            super(context);
        }
    
        public FontTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
            setCustomFont(this, attrs);
        }
    
        public FontTextView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            setCustomFont(this, attrs);
        }
    
        private void setCustomFont(Context context, AttributeSet attrs) {
            if (isInEditMode()) {
                // Ignore if within Eclipse
                return;
            }
            String font = "myDefaultFont.ttf";
            if (attrs != null) {
                // Look up any layout-defined attributes
                TypedArray a = obtainStyledAttributes(attrs,
                        R.styleable.FontTextView);
                for (int i = 0; i < a.getIndexCount(); i++) {
                    int attr = a.getIndex(i);
                    switch (attr) {
                    case R.styleable.FontTextView_customFont:
                        font = a.getString(attr, 0);
                        break;
                    }
                }
                a.recycle();
            }
            Typeface tf = null;
            try {
                tf = Typeface.createFromAsset(getAssets(), font);
            } catch (Exception e) {
                Log.e("Could not get typeface: " + e.getMessage());
            }
            setTypeface(tf);
        }
    
    }
    

    Define the attribute in res/values/attrs.xml:

    
    
    
        
            
        
    
    
    

    Use it in a layout:

    1. Declare the namespace:

      xmlns:custom="http://schemas.android.com/apk/res/com.example"
      
    2. Use the FontTextView:

      
      

    0 讨论(0)
提交回复
热议问题