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éattrs
null
. - Ceci s'applique uniquement à l'implémentation
BridgeContext
utilisée dans Eclipse, qui s'attend à ce queattrs
soit une instance duBridgeXmlBlockParser
. L'argumentattrs
estnull
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);
}
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. –
Je l'ai ajouté, espérons que cela aide :) – beetstra
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