代码之家  ›  专栏  ›  技术社区  ›  beetstra

以编程方式从Android中的自定义组件创建滚动视图

  •  3
  • beetstra  · 技术社区  · 16 年前

    我正在尝试在Android中构建一个复合控件,其中包含(除其他外)一个滚动视图。当我试图在Eclipse中查看控件时出错,错误消息“Parser不是BridgeXmlBlockParser”后出现NullPointerException。

    Stacktrace:

    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() 呼叫返回 null attrs 传递的参数为 无效的 .
    • 这只适用于 BridgeContext Eclipse中使用的实现,它期望 阿特斯 作为 BridgeXmlBlockParser .
    • 这个 阿特斯 论证是 无效的 因为我使用(上下文)构造函数创建了滚动视图。

    当然,还有一个解决方案,它正在通过 阿特斯 当Eclipse构造复合控件时收到,但我不希望复合控件上设置的所有属性应用于内部控件。

    我做错什么了吗?这是安卓Eclipse中的一个bug吗?

    这就是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 回复  |  直到 14 年前
        1
  •  1
  •   Andrei    14 年前

    如何通过XML布局或在代码中动态创建复合控件? 我能想到的一个可能的原因是您正在通过XML添加它,但是您可能没有添加StringPicker(上下文上下文,attributeset attrs)构造函数。在那里你应该称为超级(上下文,属性)。

        2
  •  0
  •   beetstra    14 年前

    这似乎是旧版安卓系统的一个缺陷。

    该问题不会出现在Android 2.3或更高版本中,但会在选择Android 2.2或更低版本时出现。这些旧版Android的解决方案是(如问题中提到的)复制 attrs 来自构造函数的参数。
    只有当您希望在Eclipse中将Design View与这些旧版本一起使用时,才需要这样做,以便在旧版本中运行您的应用程序,而不需要任何解决方案。