3

ScrollViewを含む(とりわけ)複合コントロールをAndroidで構築しようとしています。Eclipseでコントロールを表示しようとすると、「パーサーはBridgeXmlBlockParserではありません」というエラーメッセージの後にNullPointerExceptionが発生してクラッシュします。

スタックトレース:

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()呼び出しが返されるため、NPEがスローされます。nullattrsnull
  • これは、のインスタンスであることがBridgeContext期待されるEclipseで使用される実装にのみ適用されます。attrsBridgeXmlBlockParser
  • attrs引数は、null(コンテキスト)コンストラクターを使用してScrollViewを作成するためです。

もちろん、attrsEclipseが複合コントロールを構築するときに受け取る回避策がありますが、複合コントロールに設定されているすべての属性を内部コントロールに適用したくありません。

私は何か間違ったことをしていますか、これは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);
}
4

2 に答える 2

1

XMLレイアウトを介して、またはコード内で動的に、複合コントロールをどのように作成していますか?私が考えることができる考えられる理由は、XMLを介して追加しているが、StringPicker(Context context、AttributeSet attrs)コンストラクターを追加していない可能性があることです。そこで、super(context、attrs)を呼び出す必要があります。

于 2011-08-30T10:04:04.110 に答える
0

古いAndroidバージョンのバグのようです。

この問題は、Androidバージョン2.3以降では発生しませんが、Android2.2以下を選択した場合に発生します。これらの古いAndroidバージョンの回避策は、(質問で述べたように)attrsコンストラクターからパラメーターをコピーすることです。
これは、これらの古いバージョンでEclipseのdesign-viewを使用する場合にのみ必要です。古いバージョンでアプリケーションを実行するには、回避策は必要ありません。

于 2011-08-31T09:34:02.970 に答える