2010-05-21 1 views
3

Я пытаюсь создать составной элемент управления на Android, содержащий (помимо прочего) ScrollView. Все происходит неправильно, когда я пытаюсь просмотреть элемент управления в Eclipse, сбой с помощью NullPointerException после сообщения об ошибке: «Parser не является BridgeXmlBlockParser».Программно создавая scrollview (s) из пользовательского компонента в android

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.
  • Это относится только к реализации BridgeContext, используемой в Eclipse, которая ожидает, что attrs будет экземпляром BridgeXmlBlockParser.
  • Аргумент attrs: null, потому что я создаю ScrollView с помощью конструктора (Context).

Существует обходной путь, конечно, который проходит в 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); 
} 
+0

Не могли бы вы показать нам, как вы построили его в my.compound.control.StringPicker.onMeasure? В противном случае мы не можем сказать, что случилось. –

+0

Я добавил его, надеюсь, что это поможет :) – beetstra

+0

Какая линия 46? И если вы разделите это, мы не сможем увидеть, что не так. – CrackerJack9

ответ

0

Возможно, это была ошибка в старых версиях для Android.

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

1

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

+0

Да, это в значительной степени то, что я упоминаю в качестве обходного пути. Но нет необходимости применять какие-либо (XML-) атрибуты к содержащемуся компоненту, я хочу указать их в коде. – beetstra