2010-05-21 12 views
3

J'essaye de construire un contrôle composé dans Android, contenant (entre autres choses) un ScrollView. Les choses vont mal quand j'essaye de voir le contrôle dans Eclipse, écrasant avec une exception de NullPointerException après le message d'erreur: "Parser n'est pas un BridgeXmlBlockParser".Création par programme de scrollview (s) à partir du composant personnalisé dans 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) 
... 

J'ai retracé l'erreur aux conditions suivantes:

  • Le NPE est jeté parce qu'un appel retourne Context.obtainStyledAttributes()null lorsque l'argument est passé attrsnull.
  • Ceci s'applique uniquement à l'implémentation BridgeContext utilisée dans Eclipse, qui s'attend à ce que attrs soit une instance du BridgeXmlBlockParser. L'argument attrs est null parce que je crée le ScrollView en utilisant le constructeur (Context).

Il existe une solution bien sûr, qui passe la attrs que je reçois quand Eclipse construit le contrôle composé, mais je ne veux pas tous les attributs définis sur le contrôle du composé à appliquer à mon contrôle interne.

Est-ce que je fais quelque chose de mal, est-ce un bug dans Android Eclipse, ...?

C'est ce que my.compound.control.StringPicker.onMeasure ressemble (dépouillé un peu de clarté):

@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

Pourriez-vous nous montrer comment vous l'avez construit dans my.compound.control.StringPicker.onMeasure? Sinon, nous ne pouvons pas dire ce qui ne va pas. –

+0

Je l'ai ajouté, espérons que cela aide :) – beetstra

+0

Quelle ligne est 46? Et si vous dépouillé les choses, nous ne pouvons pas être en mesure de voir ce qui ne va pas. – CrackerJack9

Répondre

0

Il semble avoir été un bug dans les anciennes versions d'Android.

Le problème n'apparaît pas dans Android version 2.3 ou ultérieure, mais apparaît lors de la sélection d'Android 2.2 ou inférieur. La solution de contournement pour ces anciennes versions d'Android est (comme mentionné dans la question) de copier le paramètre attrs du constructeur.
Cela n'est nécessaire que si vous souhaitez utiliser la vue de conception dans Eclipse avec ces anciennes versions. Pour exécuter votre application dans les anciennes versions, aucune solution de contournement n'est nécessaire.

1

Comment vous créez votre contrôle composé, via la mise en page XML ou dynamiquement dans le code ? Une raison possible à laquelle je pourrais penser est que vous l'ajoutez via XML mais que vous n'avez peut-être pas ajouté le constructeur StringPicker (Context context, AttributeSet attrs). Là vous devriez appeler super (context, attrs).

+0

Oui, c'est à peu près ce que je mentionne comme une solution de contournement. Mais il n'est pas nécessaire d'appliquer des attributs (XML-) au composant contenu, je veux les spécifier dans le code. – beetstra