2010-05-21 65 views
3

我试图在Android中构建一个复合控件,其中包含(除其他外)一个ScrollView。当我尝试查看Eclipse中的控件时发生错误,在出现错误消息后出现NullPointerException:“解析器不是BridgeXmlBlockParser”。以编程方式创建自定义组件中的滚动视图android

堆栈跟踪:

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) 
... 

我跟踪的误差以下条件:

  • 的NPE被抛出,因为Context.obtainStyledAttributes()调用返回nullattrs参数传递是null
  • 这仅适用于Eclipse中使用的BridgeContext实现,该实现预计attrsBridgeXmlBlockParser的实例。
  • attrs参数是null,因为我使用(Context)构造函数创建了ScrollView。

当然还有一个解决办法,这是我经过时收到的Eclipse构建复合控制的attrs,但我不希望在复合控制设置应用到我的内部控制的所有属性。

我做错了什么,这是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

你会告诉我们你是如何在my.compound.control.StringPicker.onMeasure中创建它的?否则,我们不能说出了什么问题。 – 2010-05-21 13:20:04

+0

我已经添加了,希望能帮到:) – beetstra 2010-05-21 13:44:20

+0

哪一行是46?如果你把事情搞清楚了,我们可能无法看到出了什么问题。 – CrackerJack9 2011-08-18 14:00:30

回答

0

这似乎是旧版Android版本中的一个错误。

该问题并未出现在Android 2.3或更高版本中,但在选择Android 2.2或更低版本时出现。这些较旧的Android版本的解决方法是(如问题中所述)从构造函数复制attrs参数。
只有当您希望在Eclipse中使用这些较旧版本的设计视图时才需要这样做,以便在旧版本中运行您的应用程序,而不需要解决方法。

1

你是如何创建复合控制,通过XML布局或动态代码? 我可以想到的一个可能的原因是您要通过XML添加它,但是您可能没有添加StringPicker(Context上下文,AttributeSet attrs)构造函数。在那里你应该叫超级(背景,attrs)。

+0

是的,这几乎是我提到的一种解决方法。但是不需要将任何(XML-)属性应用于包含的组件,我想在代码中指定它们。 – beetstra 2011-08-31 09:29:39

相关问题