Erreur lors du référencement d’une classe interne View in layout / main.xml

Grrr …

Je crée une sous-classe de vue en tant que classe interne dans mon activité. Avant je me suis simplement lié à cette vue de mon activité avec:

setContentView(new CustomView(this)); 

sans problème.

Maintenant, cependant, ma vue devient de plus en plus complexe, alors je l’intègre dans FrameLayout pour que je puisse en faire la vue de base et append un widget Spinner par-dessus. Le problème est que lorsque je fais cela, je reçois une erreur:

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.grafightscratch.ochemmer/com.grafightscratch.ochemmer.MoleculeTablet}: android.view.InflateException: Binary XML file line #4: Error inflating class com.grafightscratch.ochemmer.MoleculeTablet.MoleculeTabletView ... Caused by: android.view.InflateException: Binary XML file line #4: Error inflating class com.grafightscratch.ochemmer.MoleculeTablet.MoleculeTabletView ... Caused by: java.lang.ClassNotFoundException: com.grafightscratch.ochemmer.MoleculeTablet.MoleculeTabletView in loader dalvik.system.PathClassLoader@43b74a28 

Donc, cette vue a fonctionné auparavant quand je l’ai liée directement, mais quand j’ai essayé de l’append dans le fichier main.xml dans le cadre d’un framelayout, j’ai eu l’erreur ci-dessus. J’ai aussi essayé de mettre en page avec seulement ce qui était affiché via:

  

Rien ne fonctionne. Je continue à recevoir les erreurs InflateException / ClassNotFoundException. Il se plaint de la “ligne n ° 3” dans le fichier XML binary, et s’il s’agit de main.xml, c’est la déclaration de paquetage que j’ai vérifiée trois fois.

EDIT J’ai essayé de faire de cette vue une classe séparée (c.-à-d. Pas une classe interne) et cela fonctionne. Après quelques recherches, j’ai trouvé des articles disant que la balise XML devrait ressembler à ceci:

  

Par exemple, un signe dollar doit être utilisé pour séparer la classe interne de la classe principale. Cependant, Eclipse se rabat sur cela, appelle cela une erreur et refuse de me laisser construire ou déployer avec ce personnage. Alors maintenant, la question devient: comment référencer une vue qui est une classe interne?

Pour les classes internes, la syntaxe devient:

  

La raison en est que $ est un caractère illégal dans les balises XML.

J’avais le même problème. La syntaxe dans le fichier XML était correcte, cependant.

Ce qui a fini par résoudre le problème pour moi, c’est que la classe interne doit être déclarée comme statique. Par exemple:

 public static class myWebView extends WebView 

pour la classe interne:

  

et pour la classe interne, vous devez déclarer votre classe:

 public static InnerClass 

static est nécessaire.

  

Ce code a fonctionné pour moi. Quand j’ai laissé de côté certains éléments comme layout_width, mon programme a planté. Je devais aussi rendre ma classe de vue statique pour qu’elle fonctionne. Au bout du compte, cela aurait été pareil si je venais de le sortir de son nid. L’exemple de note Android utilise une classe nestede.

Voici quelques points clés pour créer une vue personnalisée dans une classe interne …

 public static class MainClass { .... .... public class SubClassView extends LinearLayout { public SubClassView(Context context, AtsortingbuteSet attrs) { super(context, attrs); ..... } .... .... } } 

La mise en page doit être comme suit:

  

Classe Java

  • statique est nécessaire
  • le constructeur avec AtsortingbuteSet est requirejs (au moins un)

Fichier XML

  • la balise view (avec la minuscule NOT View) est requirejse
  • tag de classe avec le chemin d’access à votre classe interne, en utilisant
  • $ au lieu de “.” avant votre nom SubClassView

Vous devez spécifier le nom complet de votre classe de vue dans le code XML pour que l’inflation fonctionne et que la classe de vue soit trouvée par le système d’exécution.
Puisque vous avez déclaré votre View en tant que classe interne de votre activité, le nom complet sera: .OuterClassName.InnerClassName

Êtes-vous sûr que com.grafightscratch.ochemmer.CustomView est le nom complet de votre classe?

EDIT: Merci de me le rappeler. Lorsque les vues sont déclarées en tant que classes nestedes, il existe une légère aberration, voir Utilisation du composant personnalisé de ce document.