web-dev-qa-db-fra.com

erreur java.lang.StackOverFlow. Vous soupçonnez trop de points de vue?

Lorsque vous obtenez une erreur comme celle ci-dessous (Android 1.5), est-ce dû au fait qu'il y a trop de groupes de vues imbriqués ou au nombre total de vues trop important? Existe-t-il des astuces pour contourner le problème tout en conservant le même aspect sur votre application?

Java.lang.StackOverflowError
   at Android.text.Styled.measureText(Styled.Java:371)
   at Android.text.Layout.measureText(Layout.Java:1600)
   at Android.text.Layout.getLineMax(Layout.Java:654)
   at Android.text.Layout.draw(Layout.Java:310)
   at Android.text.BoringLayout.draw(BoringLayout.Java:356)
   at Android.widget.TextView.onDraw(TextView.Java:3921)
   at Android.view.View.draw(View.Java:5838)
   at Android.view.ViewGroup.drawChild(ViewGroup.Java:1486)
   at Android.view.ViewGroup.dispatchDraw(ViewGroup.Java:1228)
   at Android.view.ViewGroup.drawChild(ViewGroup.Java:1484)
   at Android.view.ViewGroup.dispatchDraw(ViewGroup.Java:1228)
   at Android.widget.AbsListView.dispatchDraw(AbsListView.Java:1319)
   at Android.widget.ListView.dispatchDraw(ListView.Java:2820)
   at Android.view.View.draw(View.Java:5944)
   at Android.widget.AbsListView.draw(AbsListView.Java:2121)
   at Android.view.ViewGroup.drawChild(ViewGroup.Java:1486)
   at Android.view.ViewGroup.dispatchDraw(ViewGroup.Java:1228)
   at Android.view.ViewGroup.drawChild(ViewGroup.Java:1484)
   at Android.view.ViewGroup.dispatchDraw(ViewGroup.Java:1228)
   at Android.view.View.draw(View.Java:5841)
   at Android.widget.FrameLayout.draw(FrameLayout.Java:352)
   at Android.view.ViewGroup.drawChild(ViewGroup.Java:1486)
   at Android.view.ViewGroup.dispatchDraw(ViewGroup.Java:1228)
   at Android.view.ViewGroup.drawChild(ViewGroup.Java:1484)
   at Android.view.ViewGroup.dispatchDraw(ViewGroup.Java:1228)
   at Android.view.View.draw(View.Java:5841)
   at Android.widget.FrameLayout.draw(FrameLayout.Java:352)
   at Android.view.ViewGroup.drawChild(ViewGroup.Java:1486)
   at Android.view.ViewGroup.dispatchDraw(ViewGroup.Java:1228)
   at Android.view.View.draw(View.Java:5841)
   at Android.view.ViewGroup.drawChild(ViewGroup.Java:1486)
   at Android.view.ViewGroup.dispatchDraw(ViewGroup.Java:1228)
   at Android.view.View.draw(View.Java:5841)
   at Android.view.ViewGroup.drawChild(ViewGroup.Java:1486)
   at Android.view.ViewGroup.dispatchDraw(ViewGroup.Java:1228)
   at Android.view.View.draw(View.Java:5841)
   at Android.widget.FrameLayout.draw(FrameLayout.Java:352)
   at Android.view.ViewGroup.drawChild(ViewGroup.Java:1486)
   at Android.view.ViewGroup.dispatchDraw(ViewGroup.Java:1228)
   at Android.view.ViewGroup.drawChild(ViewGroup.Java:1484)
   at Android.view.ViewGroup.dispatchDraw(ViewGroup.Java:1228)
   at Android.view.ViewGroup.drawChild(ViewGroup.Java:1484)
   at Android.view.ViewGroup.dispatchDraw(ViewGroup.Java:1228)
   at Android.view.View.draw(View.Java:5841)
   at Android.widget.FrameLayout.draw(FrameLayout.Java:352)
   at com.Android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.Java:1847)
   at Android.view.ViewRoot.draw(ViewRoot.Java:1217)
   at Android.view.ViewRoot.performTraversals(ViewRoot.Java:1030)
   at Android.view.ViewRoot.handleMessage(ViewRoot.Java:1482)
   at Android.os.Handler.dispatchMessage(Handler.Java:99)
   at Android.os.Looper.loop(Looper.Java:123)
   at Android.app.ActivityThread.main(ActivityThread.Java:3948)
   at Java.lang.reflect.Method.invokeNative(Native Method)
   at Java.lang.reflect.Method.invoke(Method.Java:521)
   at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:782)
   at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:540)
   at dalvik.system.NativeStart.main(Native Method)
23
synic

Vous avez (beaucoup) trop de mises en page imbriquées. Vous pouvez consulter le blog Android officiel à l'adresse d.Android.com pour obtenir des conseils et astuces sur la façon d'optimiser les dispositions.

32
Romain Guy

dans mon cas, j'ai résolu par 

onCreateView

        rootView = inflater.inflate(R.layout.fragment_interest_list, container);
        return rootView;

en ajoutant attachToRoot paramètre

         rootView = inflater.inflate(R.layout.fragment_interest_list,container,false);
         return rootView;
6
Ishtiaq

Dans mon cas, cela était dû à des mises en page imbriquées (liste complexe) dans une liste à l'intérieur d'un fragmenteur pager de vue dans un autre fragment, à l'aide du support v4 et des bibliothèques HoloEverywhere v1.4.

J'ai dû supprimer des fragments imbriqués et les construire d'une manière différente.

5
JPMagalhaes

Dans mon cas, 

La vue liste personnalisée a une disposition relative, puis elle a publié Stackoverflowerror

Si votre listview a une disposition relative, effacez-la: D 

2
larsien

Dans mon cas et dans XamarinForms, j'ai résolu cette erreur en ajoutant CachingStrategy="RecycleElement" à ma ListView et en supprimant les dispositions supplémentaires.
Les utilisateurs d’Android doivent utiliser RecyclerView ou d’autres méthodes de recyclage des vues.

0
Dr TJ

Dans mon cas, c'était ListView dans ScrollView et quand j'essaie de le faire défiler jusqu'en bas. Cela produit une erreur de débordement.

Donc, évitez d'avoir ListView à l'intérieur de ScrollView.

Ou nous pouvons utiliser une approche différente pour implémenter ListView.

Vue de liste Android dans une vue de défilement

0
Vinit Siriah

L'utilisation de ListViews dans Xamarin Forms n'a pas résolu le problème. L'exception n'a pas cessé de s'afficher sur un carrousel. Nous ne pouvons pas appeler la méthode draw à partir d'un autre thread car certains graphiques peints avec NControl ne nous le permettent pas de le faire (je suppose que cela concerne OpenGL). En fin de compte, capturer l'exception dans notre rendu personnalisé dans carrousel et appeler Invalidate () dessus ont résolu le problème.