私のフラグメントでは、_ArrayList<Animal>
_を取得します。 newInstance関数を作成しました。
_ companion object {
private val ARG_TITLE = "ARG_TITLE"
private val ARG_ANIMALS = "ARG_ANIMALS"
fun newInstance(title: String,animals: ArrayList<Animal>): ExampleFragment{
val fragment = ExampleFragment()
val args = Bundle()
args.putString(ARG_TITLE, title)
args.putSerializable(ARG_ANIMALS, animals)
fragment.arguments = args
return fragment
}
}
_
そして私のonCreate()
にはこれがあります。
_ private var title: String = ""
lateinit private var animals:ArrayList<Animal>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (arguments != null) {
title = arguments.getString(ARG_TITLE)
animals = arguments.getSerializable(ARG_ANIMALS)
}
}
_
だが
必須:シリアライズされたArrayListが見つかりました!
ArrayListにもキャストできません。
コメントで述べたように、それをキャストします:
注:ArrayListの場合、Serializableへのキャストは不要です(つまり、ArrayList
-ListとMutableListは異なる影響を受けます)。 List
およびMutableList
はSerializableにキャストする必要があります(そうしないと、「互換性のないタイプ」エラーが表示されます)
args.putSerializable(ARG_ANIMALS, animals as Serializable) //This is to cast it to the appropriate form in order for it to be serialized properly
そしてそれを出力にミラーリングします:
ここでのキャストは、何があっても必要です。それ以外の場合は、シリアライズ可能なクラスではなく、シリアライズ可能なクラスを取得します。
animals = arguments.getSerializable(ARG_ANIMALS) as ArrayList<Animal>
タイプはひし形で指定する必要があります。指定しないと、animals: ArrayList<Animal>
がArrayList<*>
と一致しないためにエラーが発生します。
ただし、どのタイプを受け入れるかを一般化するために、ArrayListではなくListの使用を検討することもできます(インスタンスのMutableListを含めます)。
そして、これは、AnimalがSerializableを実装している場合にのみ機能します。そうしないと、バンドルからリストを配置/取得するとクラッシュします。リストは、それらのクラスもそうである場合にのみシリアライズ可能です。
インテントフラグメントのArrayListの取得は、次のコード行で行われます。また、このコードは、オブジェクト型のSerializableおよびNon-Serializable ArrayListの両方で機能します。
//first add this dependency in app build.gradle file
compile 'com.google.code.gson:gson:2.8.0'
//to send the arraylist contains elements of object type.
ArrayList<Object> mOrderList=new ArrayList();
//suppose this list now contains some data like number of objects.
Fragment fragment new YourFragment();
Bundle bundle=new Bundle();
Gson gson = new Gson();
String jsonDetails = gson.toJson(mOrderList);
bundle.putString(IntentKeyConstants.TAG_ORDER_LIST, jsonDetails);
fragment.setArguments(bundle);
FragmentTransaction fragmentTransaction=getActivity().getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.main_frame, fragment, CURRENT_TAG);
fragmentTransaction.addToBackStack(CURRENT_TAG);
fragmentTransaction.commit();
//to get the arraylist contains the element of object type in fragment
ArrayList<Object> mOrderList=new ArrayList();
Gson gson=new Gson();
String jsonDetails;
jsonDetails=getArguments().getString(IntentKeyConstants.TAG_ORDER_LIST);
Type type=new TypeToken<ArrayList<SuggestionResponseBean>>(){}.getType();
mOrderList=gson.fromJson(jsonDetails,type);
このソリューションがお役に立てば幸いです。ありがとう
動物クラスにSerializableを実装させ、以下のコードを使用してバンドルにデータを設定する必要があります
args.putSerializable(ARG_ANIMALS, animals)
以下のように別のフラグメントでデータを取得するには
animals = arguments.getSerializable(ARG_ANIMALS)