我正在尝试在Android中构建一个复合控件,其中包含(除此之外)ScrollView。当我尝试在Eclipse中查看控件时出错,在错误消息后出现NullPointerException:“Parser不是BridgeXmlBlockParser”。
堆栈跟踪:
java.lang.NullPointerException
at android.view.View.<init>(View.java:1720)
at android.view.ViewGroup.<init>(ViewGroup.java:277)
at android.widget.FrameLayout.<init>(FrameLayout.java:83)
at android.widget.ScrollView.<init>(ScrollView.java:128)
at android.widget.ScrollView.<init>(ScrollView.java:124)
at android.widget.ScrollView.<init>(ScrollView.java:120)
at my.compound.control.StringPicker.onMeasure(StringPicker.java:46)
...
我已将错误追溯到以下条件:
Context.obtainStyledAttributes()
参数为null
时,attrs
调用返回null
,因此抛出NPE。BridgeContext
实现,期望attrs
成为BridgeXmlBlockParser
的实例。attrs
参数为null
因为我使用(Context)构造函数创建ScrollView。当然有一种解决方法,即在Eclipse构造复合控件时传递attrs
,但我不希望复合控件上设置的所有属性都应用于我的内部控件。 / p>
我做错了什么,这是Android Eclipse中的一个错误,......?
这就是my.compound.control.StringPicker.onMeasure的样子(为了清楚起见,将其剥离了一点):
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (this.getChildCount() != requestedLength) {
this.removeAllViews();
int childWidth = getWidth() / requestedLength;
int childHeight = getHeight();
for (int i = 0; i < requestedLength; i++) {
ScrollView child = new ScrollView(getContext()); // NPE here
child.setLayoutParams(new LayoutParams(childWidth, childHeight));
addView(child);
}
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
答案 0 :(得分:1)
如何通过XML布局或动态在代码中创建复合控件? 我能想到的一个可能原因是你是通过XML添加它,但你可能没有添加StringPicker(Context context,AttributeSet attrs)构造函数。在那里你应该打电话给super(context,attrs)。
答案 1 :(得分:0)
这似乎是旧Android版本中的一个错误。
此问题不会出现在Android 2.3或更高版本中,但会在选择Android 2.2或更低版本时出现。这些较旧的Android版本的解决方法是(如问题中所述)从构造函数中复制attrs
参数。
只有在Eclipse中使用带有这些旧版本的设计视图时,才需要这样做,以便在旧版本中运行应用程序,无需解决方法。