Я пытаюсь создать составной элемент управления в Android, содержащий (среди прочего) ScrollView.Когда я пытаюсь просмотреть элемент управления в Eclipse, происходит сбой, и происходит сбой с NullPointerException после сообщения об ошибке: «Parser не является BridgeXmlBlockParser».
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
равен null
. - Thisприменяется только к реализации
BridgeContext
, используемой в Eclipse, которая ожидает, что attrs
будет экземпляром BridgeXmlBlockParser
. - Аргумент
attrs
равен null
, потому что я создаю ScrollView с помощью (Context) constructor.
Конечно, есть обходной путь, который проходит 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);
}