2017-12-26 29 views
0

MainActivity을 포함하는 응용 프로그램이 있고 각 탭에 다른 단편을 호스트합니다. 이 메커니즘은 FragmentPageAdapter를 확장하는 SectionPageAdapter를 통해 작동합니다. 탭의Parcelable IOException - 직렬화하지 않을 때 직렬화 가능 객체 작성하기

하나는 GeneralSearchFragment

public class GeneralSearchFragment extends Fragment { 

public GeneralSearchFragment(){ 

} 

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { 
    final ConstraintLayout constraintLayout = (ConstraintLayout) inflater.inflate(R.layout.fragment_searchtab, container, false); 


    ((ImageView)constraintLayout.findViewById(R.id.searchByName)).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent intent = new Intent(); 
      intent.setClass(getActivity(), FreeSearchActivity.class); 
      startActivity(intent); 
     } 
    }); 

    return constraintLayout; 
} 

}

내가 이미지를 클릭로서, 내 코드가 다른 여러 활동을 시작한다을 제공합니다. 내 코드에서는 Activity에 아무 것도 전달하지 않으므로 직렬화 오류의 출처를 이해할 수 없습니다. 내가 뭔가를 직렬화하는 유일한 순간은 단편 물마루에 항목 목록을 전달할 때입니다. 그러나 여기서 일어나는 일과 어떻게 연관되어 있습니까?

감사 무리

는 Btw은 내가 여기를 직렬화하려고 사실이었다 경우 로그 캣이 지적하는 문제를 이해합니다. 내가 그 객체를 직렬화하는 유일한 시간은 (사실 drawable을 포함하고있다.) 다른 조각에 있으며 잘 동작한다. 그것은 나에게 어떤 오류도주지 않는다. 드로어 블은 BTW 자원

에서 로그 캣을 제공

12-26 08:17:52.853 5129-5129/com.chronocrops.chronocropps E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: com.chronocrops.chronocropps, PID: 5129 
                     java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.chronocrops.chronocropps.Model.Crop) 
                      at android.os.Parcel.writeSerializable(Parcel.java:1822) 
                      at android.os.Parcel.writeValue(Parcel.java:1770) 
                      at android.os.Parcel.writeList(Parcel.java:926) 
                      at android.os.Parcel.writeValue(Parcel.java:1719) 
                      at android.os.Parcel.writeArrayMapInternal(Parcel.java:838) 
                      at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1542) 
                      at android.os.Bundle.writeToParcel(Bundle.java:1232) 
                      at android.os.Parcel.writeBundle(Parcel.java:878) 
                      at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:157) 
                      at android.os.Parcel.writeTypedArray(Parcel.java:1462) 
                      at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:617) 
                      at android.os.Parcel.writeParcelable(Parcel.java:1791) 
                      at android.os.Parcel.writeValue(Parcel.java:1697) 
                      at android.os.Parcel.writeArrayMapInternal(Parcel.java:838) 
                      at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1542) 
                      at android.os.Bundle.writeToParcel(Bundle.java:1232) 
                      at android.app.IActivityManager$Stub$Proxy.activityStopped(IActivityManager.java:4604) 
                      at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3934) 
                      at android.os.Handler.handleCallback(Handler.java:790) 
                      at android.os.Handler.dispatchMessage(Handler.java:99) 
                      at android.os.Looper.loop(Looper.java:164) 
                      at android.app.ActivityThread.main(ActivityThread.java:6494) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
                     Caused by: java.io.NotSerializableException: android.graphics.drawable.BitmapDrawable 
                      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1233) 
                      at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1597) 
                      at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1558) 
                      at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1481) 
                      at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1227) 
                      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347) 
                      at android.os.Parcel.writeSerializable(Parcel.java:1817) 
                      at android.os.Parcel.writeValue(Parcel.java:1770)  
                      at android.os.Parcel.writeList(Parcel.java:926)  
                      at android.os.Parcel.writeValue(Parcel.java:1719)  
                      at android.os.Parcel.writeArrayMapInternal(Parcel.java:838)  
                      at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1542)  
                      at android.os.Bundle.writeToParcel(Bundle.java:1232)  
                      at android.os.Parcel.writeBundle(Parcel.java:878)  
                      at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:157)  
                      at android.os.Parcel.writeTypedArray(Parcel.java:1462)  
                      at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:617)  
                      at android.os.Parcel.writeParcelable(Parcel.java:1791)  
                      at android.os.Parcel.writeValue(Parcel.java:1697)  
                      at android.os.Parcel.writeArrayMapInternal(Parcel.java:838)  
                      at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1542)  
                      at android.os.Bundle.writeToParcel(Bundle.java:1232)  
                      at android.app.IActivityManager$Stub$Proxy.activityStopped(IActivityManager.java:4604)  
                      at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3934)  
                      at android.os.Handler.handleCallback(Handler.java:790)  
                      at android.os.Handler.dispatchMessage(Handler.java:99)  
                      at android.os.Looper.loop(Looper.java:164)  
                      at android.app.ActivityThread.main(ActivityThread.java:6494)  
                      at java.lang.reflect.Method.invoke(Native Method)  
                      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)  
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)  

편집 :

에 해당하는 조각을 반환/** *는 {@link FragmentPagerAdapter} * 섹션/탭 중 하나를/페이지. 그래서이 문제에 대한 대답을

Crop abacaxi = new Crop("Harvest begins in 10th of June", 
       getResources().getDrawable(R.drawable.abacax1), 
       "Marvila", 
       "Ananas comosus"); 

자르기 객체

public class Crop implements Serializable { 

    private String specieHarvest; 
    private Drawable specieImage; 
    private String specieLocation; 
    private String specieName; 

    public Crop(String specieHarvest, Drawable specieImage, String specieLocation, String specieName) { 
     this.specieHarvest = specieHarvest; 
     this.specieImage = specieImage; 
     this.specieLocation = specieLocation; 
     this.specieName = specieName; 
    } 

    public String getSpecieHarvest() { 
     return specieHarvest; 
    } 

    public Drawable getSpecieImage() { 
     return specieImage; 
    } 

    public String getSpecieLocation() { 
     return specieLocation; 
    } 

    public String getSpecieName() { 
     return specieName; 
    } 
} 

답변

0

: */ 공용 클래스 SectionsPagerAdapter는 FragmentPagerAdapter {

public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 
    // Mudar o retorno do getItem de acordo com a position 
    @Override 
    public Fragment getItem(int position) { 
     // getItem is called to instantiate the fragment for the given page. 
     if(position == 0){ 
      return new CalendarFragment(); 
     }else if(position == 1){ 
      Bundle bundle = new Bundle(); 
      bundle.putSerializable("crops",crops); 
      CropListFragment cropListFragment = new CropListFragment(); 
      cropListFragment.setArguments(bundle); 
      return cropListFragment; 
     }else if(position == 2){ 
      return new GeneralSearchFragment(); 
     } 
     // Should'nt reach here 
     return null; 
    } 

자르기 예를 확장합니다.

Why is it possible to pass a Drawable trough a Bundle from one Activity to a Fragment?

대답은 간단하다이 Marshled되는 원인이되지 않습니다 Fragment 인수로 객체를 전달할 때 등이 답이 게시물에 주어진 답변에 기반을 가지고있다. 즉, Fragment이 파기되지 않으면 Serialized/Deserialized되지 않습니다. 그리고이 경우 그는 새로운 Activity을 시작할 때 파괴됩니다. 나는 Fragment 안에있는 동안 어떤 오류도 발생하지 않았기 때문에 Drawable은 직렬화 가능했기 때문에 동일한 객체 (참조) 자체를 다루는 것을 거의 알지 못했습니다.