我有一个执行步进的活动。第一步是选择我拥有的2项,然后使用Serializable将其传递到另一步,并且第一步和第二步之间的通信没有问题。在第三步中,它显示比较我选择的两个项目的结果。比较的结果显示了用于这两个项目的植物。
每个项目都有一个成分,我在最后一个片段上显示了选项卡布局的差异(第3步)。配料显示的方式很好,这里没问题。但是,当我实现了意图以转到显示有关成分的详细信息的页面时,该页面将显示Java.lang.RuntimeException:宗地:无法编组值。我使用putextra将我需要的id成分发送到详细成分活动。我使用回收站视图来显示所有成分,并在回收站视图的适配器上添加意图。我在另一页上使用了相同的方式(但是在本例中,我将活动性与选项卡布局一起使用,而不是像在这种情况下那样将选项卡与选项卡布局一起使用),它可以完美地工作,并且可包裹性没有错误。
这是关于在步骤1和步骤2之间使用可序列化发送arraylist的代码行
//send data
Bundle bundle = new Bundle();
bundle.putSerializable("idJamu", (Serializable) chosenJamu);
step2fragment.setArguments(bundle);
//receive data
final ArrayList<jamuModelComparison> idJamu = (ArrayList<jamuModelComparison>)getArguments().getSerializable("idJamu");
这里没有错误,因为我可以在第二步显示数据,这是调用选项卡布局的最后一步
tabLayout = (TabLayout) view.findViewById(R.id.tablayoutComparisonJamu);
viewPager = (ViewPager) view.findViewById(R.id.viewPagerComparisonJamu);
viewPagerComparisonJamu adapter = new viewPagerComparisonJamu(getChildFragmentManager());
tabPlantComparison1 comparisonJamu1 = new tabPlantComparison1();
tabPlantComparisonJamu2 comparisonJamu2 = new tabPlantComparisonJamu2();
Bundle bundle = new Bundle();
bundle.putString("idjamu1",idjamu1);
bundle.putString("idjamu2",idjamu2);
comparisonJamu1.setArguments(bundle);
comparisonJamu2.setArguments(bundle);
adapter.addFragment(comparisonJamu1,"Jamu 1");
adapter.addFragment(comparisonJamu2,"Jamu 2");
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
这是标签布局部分1
Bundle bundle = this.getArguments();
idHerbal = bundle.getString("idjamu1");
getArguments().remove("idjamu1");
Log.d("plantTab","idplant = "+ idHerbal);
Log.d("tab 1 comparison","tab called = " + idHerbal);
getIdCrude(idHerbal);
recyclerView = (RecyclerView) view.findViewById(R.id.recyclerview_plant_comparison_jamu1);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
adapter = new showsPlantAdapter(crudeModels,getActivity());
recyclerView.setAdapter(adapter);
这是标签布局部分2
crudeModels = new ArrayList<>();
Bundle bundle = this.getArguments();
idHerbal = bundle.getString("idjamu2");
getArguments().remove("idjamu2");
Log.d("plantTab","idplant = "+ idHerbal);
Log.d("tab 2 comparison","tab called = " + idHerbal);
getIdCrude(idHerbal);
recyclerView = (RecyclerView) view.findViewById(R.id.recyclerview_plant_comparison_jamu2);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
adapter = new showsPlantAdapter(crudeModels,getActivity());
recyclerView.setAdapter(adapter);
几乎与选项卡布局1相同,但是使用不同的idherbs。
这是在回收站视图中使用意图的商品的适配器
crudeViewHolderComparison.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(mCtx, detailCrude.class);
i.putExtra("idPlant",idPlant);
mCtx.startActivity(i);
}
});
这是我在详细信息类上收到它的方式
String idPlant = getIntent().getStringExtra("idPlant");
我已经尝试将其用于另一个完全不需要任何捆绑包的活动,但仍然会产生关于包裹的错误。而有趣的部分是错误总是来自第一个“选项卡布局”部分,每个项目我总是总是从选项卡1中选择错误,即使我很难按一下选项卡2上的项目(基于logcat)。 这是logcat
2019-03-29 19:08:30.754 24942-24942/com.example.ilham.obatherbal E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.ilham.obatherbal, PID: 24942
java.lang.RuntimeException: Parcel: unable to marshal value Enolimit
at android.os.Parcel.writeValue(Parcel.java:1508)
at android.os.Parcel.writeList(Parcel.java:820)
at android.os.Parcel.writeValue(Parcel.java:1455)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:732)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1423)
at android.os.Bundle.writeToParcel(Bundle.java:1133)
at android.os.Parcel.writeBundle(Parcel.java:772)
at android.support.v4.app.FragmentState.writeToParcel(FragmentState.java:124)
at android.os.Parcel.writeTypedArray(Parcel.java:1338)
at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:639)
at android.os.Parcel.writeParcelable(Parcel.java:1527)
at android.os.Parcel.writeValue(Parcel.java:1433)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:732)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1423)
at android.os.Bundle.writeToParcel(Bundle.java:1133)
at android.os.Parcel.writeBundle(Parcel.java:772)
at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3685)
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3865)
at android.os.Handler.handleCallback(Handler.java:754)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:165)
at android.app.ActivityThread.main(ActivityThread.java:6375)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
Enolimit是具有我单击的成分的项目的示例