我有一个带有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并在Activity中调用它-但是
mLogList
为空,我得到了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
}
请告知如何将我的适配器传递给Fragment。
更新:
我尝试了Exception Lover的建议(感谢+1),但收到此错误:
Bundle类型的方法putParcelableArrayList(String,ArrayList)不适用于参数
(字符串,ArrayAdapter)
但我不确定,我应该采取哪些快速修复建议:
我也想知道为什么不能使用
savedInstanceState
-在将数据从Activity传递到Fragment时,真的需要创建一个新的Bundle
对象吗? 最佳答案
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.putParcelableArrayList("arraylist", data);
fragment.setArguments(bundle);
getFragmentManager().beginTransaction()
.replace(R.id.root, fragment, "main")
.commit();
}
}
还要改变
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);
Bundle extras = getArguments();
if (extras != null) {
data = extras.getParcelableArrayList("arraylist");
mLogList.setAdapter(new MyAdapter(getActivity(), data));
}
mLogList.setChoiceMode(ListView.CHOICE_MODE_NONE);
return view;
}