从自定义组件调用 Typeface.createFromAsset 导致 Android Studio 中的 npe
Calling Typeface.createFromAsset from custom component causes npe in AndroidStudio
由于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);;
}
}
好吧,这个东西在 Emulator/real Android 设备中完美运行。但是 android studio (2.1.2.0-1) 的预览会抛出 NPE。我可以继续忍受并测试设备中的所有内容,但这会使开发变得非常缓慢 w/o 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
?就像这个 topic
中的人所说的那样
有什么想法吗?
此致,
啊,nvm 这是 AndroidStudio
中的 bug。固定在 Android Studio 2.2 Preview 7
由于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);;
}
}
好吧,这个东西在 Emulator/real Android 设备中完美运行。但是 android studio (2.1.2.0-1) 的预览会抛出 NPE。我可以继续忍受并测试设备中的所有内容,但这会使开发变得非常缓慢 w/o 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
?就像这个 topic
有什么想法吗?
此致,
啊,nvm 这是 AndroidStudio
中的 bug。固定在 Android Studio 2.2 Preview 7