Вызов Typeface.createFromAsset из пользовательского компонента вызывает npe в AndroidStudio

Поскольку невозможно указать собственный шрифт в xml, я хочу наследовать все компоненты и добавить туда новый параметр fontType. Например, если мне нужна кнопка с пользовательским шрифтом, это будет выглядеть так:

деятельность.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 (2.1.2.0-1) выдает NPE. Я могу продолжать страдать и тестировать все на устройствах, но без предварительной версии AndroidStudio разработка будет очень медленной.

введите здесь описание изображения

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, или я должен позвонить createFromAsset где-то еще? Как сказал парень в этой теме

Есть предположения?

С наилучшими пожеланиями,


person deathangel908    schedule 18.12.2016    source источник


Ответы (1)


Ах, nvm, это ошибка в AndroidStudio. Исправлено в Android Studio 2.2 Preview 7

person deathangel908    schedule 18.12.2016