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)
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.
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;
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.
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
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.
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.
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.