2014-06-23 39 views
4

我一直在開發android應用程序一段時間,但最近才進入碎片,因此我遇到了很多問題,學習如何使用它們。我的應用程序中的一項活動有四個不同的片段,每個片段都向用戶顯示一個項目列表。每個片段首先被創建,並且只有在選擇了另一個選項卡後纔會顯示一次。一旦這些片段創建一個JSONObjects的ArrayList作爲參數如下片段與包裹崩潰:無法在調用onPause方法時發生編組值錯誤

  ft = fm.beginTransaction(); 

      if(currentFragment !=null){ 
       ft.hide(currentFragment); 
      } 
      if(whereFragment !=null){ 
       ft.show(whereFragment); 
      }else{ 
       if(mPlaceList.size()>0){ 

       Bundle bundle = new Bundle(); 
       bundle.putSerializable("array", mPlaceList); 
       whereFragment = new WhereFragment(); 
       whereFragment.setArguments(bundle); 
       ft.add(R.id.newpost_container,whereFragment, "whereFragment"); 
       } 
      } 
      ft.commit(); 
      currentFragment = whereFragment; 

ArrayList的是在該片段中獲得,一切工作就好傳遞給片段。

actList = (ArrayList<JSONObject>) getArguments().getSerializable("array"); 
doingAdapter = new DoingAdapter(getActivity(), actList); 
actListView.setAdapter(doingAdapter); 

父級活動中有一個按鈕,用於啓動設備攝像頭。一旦出現這種情況,並在片段中的onPause方法被調用的應用程序崩潰,我在我的logcat得到這個錯誤

logcat的:

06-23 17:51:31.190: E/ACRA(29221): com.parspake.anar fatal error : Parcel: unable to marshal value {"type":"act","id":"5327f9827f49143f3a001c76","title":"خونه","actType":"where"} 
06-23 17:51:31.190: E/ACRA(29221): java.lang.RuntimeException: Parcel: unable to marshal value {"type":"act","id":"5327f9827f49143f3a001c76","title":"خونه","actType":"where"} 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeValue(Parcel.java:1235) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeList(Parcel.java:622) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeValue(Parcel.java:1195) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeMapInternal(Parcel.java:591) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Bundle.writeToParcel(Bundle.java:1619) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeBundle(Parcel.java:605) 
06-23 17:51:31.190: E/ACRA(29221): at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:132) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeTypedArray(Parcel.java:1102) 
06-23 17:51:31.190: E/ACRA(29221): at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:368) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeParcelable(Parcel.java:1254) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeValue(Parcel.java:1173) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeMapInternal(Parcel.java:591) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Bundle.writeToParcel(Bundle.java:1619) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeBundle(Parcel.java:605) 
06-23 17:51:31.190: E/ACRA(29221): at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2096) 
06-23 17:51:31.190: E/ACRA(29221): at android.app.ActivityThread$StopInfo.run(ActivityThread.java:2918) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Handler.handleCallback(Handler.java:615) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Handler.dispatchMessage(Handler.java:92) 
06-23 17:51:31.190: E/ACRA(29221): at android.os.Looper.loop(Looper.java:137) 
06-23 17:51:31.190: E/ACRA(29221): at android.app.ActivityThread.main(ActivityThread.java:4827) 
06-23 17:51:31.190: E/ACRA(29221): at java.lang.reflect.Method.invokeNative(Native Method) 
06-23 17:51:31.190: E/ACRA(29221): at java.lang.reflect.Method.invoke(Method.java:511) 
06-23 17:51:31.190: E/ACRA(29221): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
06-23 17:51:31.190: E/ACRA(29221): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608) 
06-23 17:51:31.190: E/ACRA(29221): at dalvik.system.NativeStart.main(Native Method) 

我已經在計算器一直環顧四周,我也看到一些與我的問題類似的問題,但我似乎無法從他們中的任何一個可以幫助我的情況。我確實得到了這個問題的要點,試圖保存它的狀態,但不能序列化我的json對象,但如果有人能夠幫助我使用Serializable或Parcelable接口來解決我的問題,那將是非常好的,那將是大。另外,我已經在片段和活動中實現了Serializable,因爲它已經被其他人所建議。

回答

2

那麼我設法找出了一條出路,它可能不是最標準的做事方式,但它實際上解決了我的問題,並可能在一定程度上幫助他人。

我所做的不是將從API接收到的JSON數組轉換爲JSON數組列表,然後將其發送到片段,而是將JSON數組轉換爲字符串並將其與該包一起發送。

   ft = fm.beginTransaction(); 
       if(currentFragment !=null){ 
        ft.hide(currentFragment); 
       } 
       if(doingFragment !=null){ 
        ft.show(doingFragment); 
       }else{ 
        if(mActList.size()>0){ 
        Bundle bundle = new Bundle(); 
        bundle.putString("array", jArrayWhat.toString()); 
        doingFragment = new DoingFragment(); 
        doingFragment.setArguments(bundle); 
        ft.add(R.id.newpost_container,doingFragment, "doingFragment"); 
        } 
       } 
       ft.commit(); 

在片段中,我收到包並將字符串轉換爲JSONArray。

jsonActList = new JSONArray(getArguments().getString("array")); 

然後我遍歷JSONArray並將其轉換爲JSONObject ArrayList。爲了在片段使用後保持對列表所做的更改,我將ArrayList轉換回JSONArray並保存。

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    JSONArray jArray = new JSONArray(Arrays.asList(actList)); 
    outState.putString("jsonArray", jArray.toString()); 
} 

現在的狀態保存它可以很容易地在onCreateView方法恢復如下

if ((savedInstanceState != null) 
        && (savedInstanceState.getSerializable("jsonArray") != null)) { 
      jsonActList = new JSONArray(savedInstanceState.getString("jsonArray")); 
      positionList = (ArrayList<String>) savedInstanceState.getSerializable("positionList"); 
    } 

這樣我就不必處理讓我一個JSONObjects序列化或Parcelable的問題

18

如果您已經獲取了所需的數據,那麼只需從捆綁中刪除數據即可。

// get your data 
Bundle bundle = getArguments(); 
JSONObject myData = (JSONObject) bundle.getSerializable("myData"); 

// remove it 
getArguments().remove("myData"); 
+0

這聽起來像一個偉大的方式去了解它 –

+1

Im相當肯定,現在通過清除從我的包每個值我不再收到名帥錯誤,但可能有人請解釋爲什麼必須在每個值,即使去除在閱讀之後,捆綁包不再被觸摸?非常好奇! – Logic1

+0

當我開始一些活動時,我收到了這個錯誤,但是這個工作。 謝謝 –

相關問題