1 つのアクティビティと 3 つのフラグメントを持つアプリがあります。
アクティビティには、ログメッセージを保存するアダプターがあります-
MainActivity.java (アダプタを文字列で保持):
private ArrayAdapter<String> mLogListAdapter;
public void onCreate(Bundle savedInstanceState) {
.....
mLogListAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
android.R.id.text1);
if (savedInstanceState == null) {
MainFragment fragment = new MainFragment();
Bundle bundle = new Bundle();
bundle.putSerializable("LOG", (Serializable) mLogListAdapter);
//bundle.putParcellable("LOG", (Parcellable) mLogListAdapter);
getFragmentManager().beginTransaction()
.replace(R.id.root, fragment, "main")
.commit();
}
}
そして、最初のフラグメントでそのアダプターを使用したいと思います-
MainFragment.java (ログ文字列のリストを表示する必要があります):
private ListView mLogList;
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_main, container, false);
.........
mLogList = (ListView) view.findViewById(R.id.logList);
mLogList.setChoiceMode(ListView.CHOICE_MODE_NONE);
// THIS DOES NOT WORK
ListAdapter adapter =
(ListAdapter) savedInstanceState.getSerializable("LOG");
mLogList.setAdapter(adapter);
return view;
}
残念ながら、これは機能しません (アプリがクラッシュします)。
Fragment に public メソッドを追加して Activity で呼び出すことも試みましたが、mLogList
null になり、NPE を取得します (mLogList
コンストラクターではなくonCreateView
メソッドで後で作成されるため):
MainActivity.java:
if (savedInstanceState == null) {
MainFragment fragment = new MainFragment();
fragment.setAdapter(mLogListAdapter);
getFragmentManager().beginTransaction()
.replace(R.id.root, fragment, "main")
.commit();
}
MainFragment.java:
public void setAdapter(ListAdapter adapter) {
mLogList.setAdapter(adapter); // GIVES NPE
}
私のアダプターをフラグメントに渡す方法を教えてください。
アップデート:
Exception Lover の提案を試してみましたが (+1 に感謝)、次のエラーが発生します。
Bundle 型のメソッド putParcelableArrayList(String, ArrayList) は引数 (String, ArrayAdapter) には適用できません
そして、どのクイックフィックスの提案を採用すればよいかわかりません。
また、なぜ使用できないのだろうか- Activity から Fragment にデータを渡すときにsavedInstanceState
新しいオブジェクトを作成する必要があるのだろうか?Bundle