代码之家  ›  专栏  ›  技术社区  ›  deathangel908

呼叫字体。createFromAsset从自定义组件导致AndroidStudio中的npe

  •  0
  • deathangel908  · 技术社区  · 8 年前

    因为 impossible 要在xml中指定自定义字体,我希望继承所有组件并添加新参数 fontType 那里例如,如果我想要一个自定义字体的按钮,它看起来像这样:

    activity.xml :

    <LinearLayout xmlns:app="http://schemas.android.com/apk/res-auto">
        <package.Button app:fontType="GothamPro" />
    </LinearLayout>
    

    attr.xml :

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <attr name="fontType" format="enum">
            <enum name="GothamProMedium" value="0"/>
            <enum name="GothamPro" value="1"/>
        </attr>
        <declare-styleable name="Button">
            <attr name="fontType"/>
        </declare-styleable>
    
    </resources>
    

    Button.java :

    public class Button extends android.widget.Button {
    
       public static SparseArray<String> sp = new SparseArray<>();
    
       static {
          sp.put(0, "fonts/gotham/GothamProMedium.ttf");
          sp.put(1, "fonts/gotham/GothamProRegular.ttf");
       }
    
        private String path;
    
        public Button(Context context) {
            super(context);
        }
        public Button(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(attrs);
        }
    
        public Button(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init(attrs);
        }
    
        public void init(AttributeSet attrs) {
            if (attrs != null) {
                TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.Button);
                path = sp.get(a.getInt(R.styleable.Button_fontType, -1));
                a.recycle();
            }
        }
    
        @Override
        protected void onAttachedToWindow() {
            super.onAttachedToWindow();
            Typeface tf = Typeface.createFromAsset(getContext().getAssets(), path);
            setTypeface(tf);;
        }
    }
    

    这个东西在模拟器/真正的Android设备上运行得很好。但是android studio的预览版(2.1.2.0-1)抛出了NPE。我可以继续在设备上测试一切,但如果没有AndroidStudio预览,开发速度会非常慢。

    enter image description here

    java.lang.NullPointerException
    at android.graphics.Typeface.createAssetUid(Typeface.java:219)
    at android.graphics.Typeface.createFromAsset(Typeface.java:193)
    at com.mypackage.Button.onAttachedToWindow(Button.java:46)
    at android.view.View.dispatchAttachedToWindow(View.java:15509)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2923)
    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2923)
    

    这是AndroidStudio bug,还是我应该打电话 createFromAsset 其他地方?就像这个人说的 topic

    有什么想法吗?

    顺致敬意,

    1 回复  |  直到 7 年前
        1
  •  0
  •   deathangel908    8 年前

    啊,nvm是 bug 在里面 AndroidStudio .固定在 Android Studio 2.2 Preview 7