簡體   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