7
votes

Inflation de la mise en page sur mesure avec des fragments de Robolectric ne fonctionne pas

Lorsque vous gonflez une mise en page dans un fragment, avec le layoutinflater, je reçois cette exception:

android.view.InflateException: XML file ./res/layout/locations_list.xml line #-1 (sorry, not yet implemented): Error inflating class com.costum.android.widget.LoadMoreListView
    at android.view.LayoutInflater.createView(LayoutInflater.java:613)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
...
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at android.view.LayoutInflater.$$robo$$LayoutInflater_1d1f_createView(LayoutInflater.java:587)
    at android.view.LayoutInflater.createView(LayoutInflater.java)
    at android.view.LayoutInflater.$$robo$$LayoutInflater_1d1f_createViewFromTag(LayoutInflater.java:687)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java)
    at android.view.LayoutInflater.$$robo$$LayoutInflater_1d1f_rInflate(LayoutInflater.java:746)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java)
    at android.view.LayoutInflater.$$robo$$LayoutInflater_1d1f_inflate(LayoutInflater.java:489)
    at android.view.LayoutInflater.inflate(LayoutInflater.java)
    at android.view.LayoutInflater.$$robo$$LayoutInflater_1d1f_inflate(LayoutInflater.java:396)
    at android.view.LayoutInflater.inflate(LayoutInflater.java)

...

Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -9
    at java.lang.String.substring(String.java:1911)
    at org.robolectric.res.ResName.qualifyResName(ResName.java:50)
    at org.robolectric.res.Attribute.getResourceReference(Attribute.java:138)
    at org.robolectric.res.Attribute.qualifiedValue(Attribute.java:127)
    at org.robolectric.res.builder.XmlFileBuilder$XmlResourceParserImpl.qualify(XmlFileBuilder.java:316)
    at org.robolectric.res.builder.XmlFileBuilder$XmlResourceParserImpl.getAttributeValue(XmlFileBuilder.java:340)
    at org.robolectric.shadows.ShadowResources.findAttributeValue(ShadowResources.java:252)
    at org.robolectric.shadows.ShadowResources.attrsToTypedArray(ShadowResources.java:188)
    at org.robolectric.shadows.ShadowResources.access$000(ShadowResources.java:51)
    at org.robolectric.shadows.ShadowResources$ShadowTheme.obtainStyledAttributes(ShadowResources.java:460)


6 commentaires

poster locations_list.xml


Ajouter le fichier manquant.


Êtes-vous sûr que vous avez une classe com.custom.android.widget .charger plus de listeView? Peut-être qu'il y a une faute de frappe dans "costum"?


Hmm, c'est une faute de frappe mais pas la mienne. C'est l'identifiant de groupe correct et l'exécuter sur Android fonctionne.


Je ne comprends pas, alors ça marche ou pas? Et quel groupe fait-il référence?


Désolé pour le malentendu, com.costum. est le bon paquet, et le problème est donc toujours présent.


4 Réponses :


5
votes

Je l'ai compris, et si vous avez obtenu des actions à une telle situation, il suffit de rechercher vos identifiants dans le XML, même si

 android:id="@android:id/list"


4 commentaires

Normalement, je donne un identifiant de ressource comme celui-ci, Android: id = "@ + id / txtviewone". Alors, comment cela devrait être formaté pour surmonter cette question? Je reçois une erreur de compilation, si je passe à Android: id = "Android: id / txtviewone"


Android: id = "@ + id / txtviewone" va bien, le cas ci-dessus est un cas spécifique. The @ + ID / Android: ... préfixe a été utilisé dans les anciennes versions de l'API et n'est pas compatible avec Robolectric.


@Jrhamza: Vous devez ajouter @ similaire à celui-ci: android: id = "@ Android: id / txtviewone"


Je ne pensais pas que c'était une solution pour mon problème, mais c'était. Pour sauver les autres quelque temps, vous devez également le faire avec n'importe quelle vue de liste vide que vous pourriez avoir dans la mise en page, par exemple, "@android: id / vide". Si évident dans le recul, mais je n'y pensais même pas.



0
votes

Dans mon cas, j'ai eu ce problème quand j'avais ceci dans mon application: xxx

mais cela dans mon projet unit: xxx > La version ancienne de la bibliothèque de support que j'ai utilisée dans les tests ne contenait pas la classe que j'essayais d'utiliser (Android.Support.v4.widget.Drawerlayout).


0 commentaires

0
votes

Dans mon cas, mon fragmentactivité XML gonflait un fragment qui attendait un Bundle . J'ai échangé le XML pour un support Framelayout et ajouté le fragment avec le faisceau approprié dans l'activité.


0 commentaires

2
votes

La dernière version de Robolectric (3.0-Snapshot) a quelques problèmes avec des vues personnalisées.

Pour résoudre ce problème, faites le suivant:

  1. Dans l'application Module où votre code est, créez un fichier appelé projet.properties, au même niveau que AndroidManifest.xml
  2. remplissez le contenu en référence au dossier de la classe de la construction. par exemple. Pour Staggeredgridview:

    android.library.reference.1 = .. / .. / Build / Intermediates / Exploded-Aar / com.etsy.android.Grid / Bibliothèque / 1.0.5

    Ici, vous devez vérifier trois choses:


1 commentaires

Cela ne concerne pas les vues personnalisées avec des espaces de noms personnalisés définis dans votre application, cependant, n'est-ce pas? Je vois toujours cette question.