在Android Studio XML的预览部分显示自定义字体或视图

时间:2016-01-05 14:08:54

标签: android android-layout android-custom-view font-awesome

有没有办法在Android Studio的预览部分查看自定义字体/视图?

我使用 font-awesome 作为自定义字体在我的应用中显示麦克风图标。一切都很好。但是众所周知,预览部分无法加载自定义视图。

编码时是否有任何插件或黑客可以在预览窗口中看到自定义视图?

这是我在我的应用上加载的内容:

enter image description here

这是我在预览部分看到的内容:

enter image description here

2 个答案:

答案 0 :(得分:10)

要在Android Studio XML设计器中显示FontAwesome图标,您可以。

  1. 创建自定义视图
  2. 在构造函数中应用字体
  3. 如果要从xml
  4. 设置字体,请添加自定义attr

    Here is full demo code in gist

    使用评论代码演示img:

    all code in 1 picture

    重要部分:(与Declaring a custom android UI element using XML几乎相同,但调整很少)

    TextViewWithFont.java - 自定义视图类

    import android.content.Context;
    import android.content.res.TypedArray;
    import android.util.AttributeSet;
    import android.widget.TextView;
    
    public class TextViewWithFont extends TextView {
    
        public TextViewWithFont(Context context) {
            super(context);
            init(context, null, 0);
        }
        public TextViewWithFont(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(context, attrs, 0);
        }
        public TextViewWithFont(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            init(context, attrs, defStyle);
        }
        private void init(Context context, AttributeSet attrs, int defStyle) {
            // Load attributes
            TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TextViewPlusFont, 0, 0);
            try {
                String fontInAssets = ta.getString(R.styleable.TextViewPlusFont_customFont);
                setTypeface(Typefaces.get(context, "fonts/"+ fontInAssets));
            } finally {
                ta.recycle();
            }
        }
    }
    

    res / values / attrs.xml - 需要在我们的布局xml中使用app:customFont="fontawesome-webfont.ttf"

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="TextViewPlusFont">
            <attr name="customFont" format="string"/>
        </declare-styleable>
    </resources>
    

    Typefaces.java - 重用字体的Helper类(字体缓存)

    import android.content.Context;
    import android.graphics.Typeface;
    import android.util.Log;
    import java.util.Hashtable;
    
    public class Typefaces {
        private static final String TAG = "Typefaces";
    
        private static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>();
    
        public static Typeface get(Context c, String assetPath) {
            synchronized (cache) {
                if (!cache.containsKey(assetPath)) {
                    try {
                        Typeface t = Typeface.createFromAsset(c.getAssets(),
                                assetPath);
                        cache.put(assetPath, t);
                        Log.e(TAG, "Loaded '" + assetPath);
                    } catch (Exception e) {
                        Log.e(TAG, "Could not get typeface '" + assetPath
                                + "' because " + e.getMessage());
                        return null;
                    }
                }
                return cache.get(assetPath);
            }
        }
    }
    

    activity_main.xml - 布局以及如何使用TextViewWithFont自定义视图

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
    
        <com.example.TextViewWithFont
            xmlns:app="http://schemas.android.com/apk/res/com.example"
            app:customFont="fontawesome-webfont.ttf"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="\uf1e2"
            android:textSize="60dp"/>
    </LinearLayout>
    

答案 1 :(得分:3)

只要正确编写了这些视图,

预览部分就可以加载自定义视图。您必须记住所有小细节,如draw / onDraw / dispatchDraw方法,测量和布局,设置正确的主题,样式,提供editMode数据等。

这笔交易是Android Studio有自己的Context和Resources类,无法执行某些操作。例如,这些类缺少从资源文件夹中读取资产和从原始文件夹中读取原始资源的实现。

要加载自定义字体,您需要在Android Studio中无法访问的资源文件夹。自定义视图应该或多或少有效。