gpt4 book ai didi

android - 以编程方式从android中的自定义组件创建 ScrollView

转载 作者:太空狗 更新时间:2023-10-29 14:34:22 26 4
gpt4 key购买 nike

我正在尝试在 Android 中构建一个复合控件,其中包含(除其他外)一个 ScrollView。当我尝试在 Eclipse 中查看控件时出现问题,在出现错误消息后出现 NullPointerException 崩溃:“Parser is not a 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)
...

我已将错误追溯到以下情况:

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

当然有一个解决方法,就是传递 attrs我在 Eclipse 构造复合控件时收到,但我不希望复合控件上设置的所有属性都应用到我的内部控件。

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

最佳答案

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

关于android - 以编程方式从android中的自定义组件创建 ScrollView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2882346/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com