0

Так как это impossible, чтобы указать собственный шрифт в xml, я хочу наследовать все компоненты и добавить новый параметр fontType. Например, если я хочу кнопку с самодельным шрифтом он будет выглядеть следующим образом:Вызов Typeface.createFromAsset из настраиваемого компонента вызывает npe в AndroidStudio

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

Любые мысли?

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

ответ

 Смежные вопросы

  • Нет связанных вопросов^_^