Программное создание скроллвью (ов) из пользовательского компонента в Android - PullRequest
3 голосов
/ 21 мая 2010

Я пытаюсь создать составной элемент управления в 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);
}

Ответы [ 2 ]

1 голос
/ 30 августа 2011

Как вы создаете свой составной элемент управления с помощью макета XML или динамически в коде?Возможная причина, по которой я могу подумать, заключается в том, что вы добавляете его через XML, но, возможно, вы не добавили конструктор StringPicker (Context context, AttributeSet attrs).Там вы должны назвать super (context, attrs).

0 голосов
/ 31 августа 2011

Кажется, это была ошибка в старых версиях Android.

Проблема не появляется в Android версии 2.3 или выше, но появляется при выборе Android 2.2 или ниже. Обходной путь для этих более старых версий Android (как уже упоминалось в вопросе) - скопировать параметр attrs из конструктора.
Это необходимо только в том случае, если вы хотите использовать design-view в Eclipse с этими более старыми версиями, для запуска приложения в более старых версиях обходного пути не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...