以编程方式从android中的自定义组件创建scrollview(s)

时间:2010-05-21 13:16:01

标签: android custom-component scrollview

我正在尝试在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。
  • 这仅适用于Eclipse中使用的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);
}

2 个答案:

答案 0 :(得分:1)

如何通过XML布局或动态在代码中创建复合控件? 我能想到的一个可能原因是你是通过XML添加它,但你可能没有添加StringPicker(Context context,AttributeSet attrs)构造函数。在那里你应该打电话给super(context,attrs)。

答案 1 :(得分:0)

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

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