繁体   English   中英

ArrayList错误,应用程序崩溃

[英]ArrayList Error, App Crashes

我有以下问题。 我有一个带有静态arraylist的两个fragment应用程序,这两个fragments中都使用了它。

错误的发生可以这样描述:

  1. entries添加到arraylistFragmentA
  2. 点击按钮,在图表中显示arraylist片段B
  3. 返回片段A ,将另一个entrie添加到arraylist >发生错误,应用崩溃

片段的代码是这样的:

  • 片段A

     button.setOnClickListener(new View.OnClickListener() { public void onClick (View view) { if (editText3.getText().toString().matches("")) { Toast.makeText(getActivity(), "You did not enter a Valid Item ID", Toast.LENGTH_LONG).show(); return; } else if (editText2.getText().toString().matches("")) { Toast.makeText(getActivity(), "You did not enter a Valid Quantitiy", Toast.LENGTH_LONG).show(); return; } else { String nomen = (editText3.getText().toString()); float number = Float.parseFloat(editText2.getText().toString()); entries.add(new PieEntry(number, nomen)); editText3.setText(""); editText2.setText(""); editText3.requestFocus(); } } }); 
  • 片段B

      button2.setOnClickListener(new View.OnClickListener() { public void onClick (View view) { getResources().getColor(R.color.violp); getResources().getColor(R.color.bluep); getResources().getColor(R.color.redp); getResources().getColor(R.color.greenp); getResources().getColor(R.color.yellowp); getResources().getColor(R.color.orangep); getResources().getColor(R.color.lightbluep); getResources().getColor(R.color.purplep); getResources().getColor(R.color.darkredp); PieDataSet set = new PieDataSet(entries, ""); set.setColors(new int[]{R.color.bluep, R.color.greenp, R.color.violp, R.color.redp, R.color.yellowp, R.color.orangep, R.color.lightbluep, R.color.purplep, R.color.darkredp}, getActivity()); PieData datax = new PieData(set); piechart.setData(datax); Toast.makeText(getActivity(), (R.string.loading), Toast.LENGTH_SHORT).show(); piechart.setNoDataText(String.valueOf(R.string.nodata)); piechart.notifyDataSetChanged(); piechart.animateX(2000, Easing.EasingOption.EaseInExpo); piechart.animateY(2000, Easing.EasingOption.EaseInExpo); } }); 

即时消息获取错误是这样的:

java.lang.ArrayIndexOutOfBoundsException:length = 1; 索引= 1

如果一些经验丰富的专家可以帮助我,我将非常感激。 谢谢。

更新:包含错误堆栈

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.nextpietwo, PID: 2528
                  java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
                      at com.github.mikephil.charting.renderer.PieChartRenderer.drawDataSet(PieChartRenderer.java:244)
                      at com.github.mikephil.charting.renderer.PieChartRenderer.drawData(PieChartRenderer.java:147)
                      at com.github.mikephil.charting.charts.PieChart.onDraw(PieChart.java:126)
                      at android.view.View.draw(View.java:17185)
                      at android.view.View.updateDisplayListIfDirty(View.java:16167)
                      at android.view.View.draw(View.java:16951)
                      at android.view.ViewGroup.drawChild(ViewGroup.java:3727)
                      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3513)
                      at android.view.View.updateDisplayListIfDirty(View.java:16162)
                      at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3711)
                      at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3691)
                      at android.view.View.updateDisplayListIfDirty(View.java:16130)
                      at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3711)
                      at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3691)
                      at android.view.View.updateDisplayListIfDirty(View.java:16130)
                      at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3711)
                      at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3691)
                      at android.view.View.updateDisplayListIfDirty(View.java:16130)
                      at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3711)
                      at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3691)
                      at android.view.View.updateDisplayListIfDirty(View.java:16130)
                      at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3711)
                      at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3691)
                      at android.view.View.updateDisplayListIfDirty(View.java:16130)
                      at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3711)
                      at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3691)
                      at android.view.View.updateDisplayListIfDirty(View.java:16130)
                      at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3711)
                      at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3691)
                      at android.view.View.updateDisplayListIfDirty(View.java:16130)
                      at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:648)
                      at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:654)
                      at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:762)
                      at android.view.ViewRootImpl.draw(ViewRootImpl.java:2800)
                      at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2608)
                      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2215)
                      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
                      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6337)
                      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
                      at android.view.Choreographer.doCallbacks(Choreographer.java:686)
                      at android.view.Choreographer.doFrame(Choreographer.java:621)
                      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
                      at android.os.Handler.handleCallback(Handler.java:751)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:154)
                      at android.app.ActivityThread.main(ActivityThread.java:6119)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

MPAndroidChart无法使您免受不分离模型层视图层的影响以及管理片段和活动的生命周期问题的影响。 请注意, Google不建议在片段之间进行“通信”(例如,一个片段处理另一个片段的数据):

两个片段永远不要直接通信

尽管Entry看起来像是模型层的成员,但实际上将其设计为与视图层一部分的PieChart紧密耦合。 它绝对应该活得比与它相关联的搜索,如果你想避免的错误,如ArrayIndexOutOfBoundsException ,后台列表的生命周期应该与其所使用的片段的一致。 这并不意味着你不能添加/删除一个List<Entry>一旦这是一部分PieChart - MPAndroidChart将允许你在上述约束内做到这一点。

为了解决上述错误,我建议使用一种不同于共享静态对象的方法,这在Android中几乎从来都不是一个好主意。 相反,您可以共享一个单独的模型层,其中包含将用于构造List<Entry> 当片段A更新模型时,您可以使用一个事件触发从片段B中的数据重建图表。

您已经在注释中指出您正在使用ViewPager ViewPager使用fragmentTransaction.show().hide() ,通常使Fragments处于恢复状态。 也许最简单的解决方案是重写onHiddenChanged因为在ViewPager切换到新页面时始终会调用此方法。 我认为(并非100%肯定)您还将需要在onActivityCreated(View v)进行调用。

因此,您将获得以下内容:

@Override
onActivityCreated(View v) {
    //get updated model from Activity
    //rebuild chart from updated model
}

@Override 
onHiddenChanged(boolean hidden) {
    if (hidden == false) {
        //get updated model from Activity
        //rebuild chart from updated model
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM