【发布时间】:2015-04-14 15:57:49
【问题描述】:
我有一个包含 1 个 Activity 和 3 个片段的应用。
在 Activity 中,我有一个适配器,用于存储日志消息 -
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 为 null 并且我得到 NPE(因为稍后创建了 mLogList - 不是在构造函数中,而是在 @ 987654326@方法):
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) 方法不适用于参数 (字符串,数组适配器)
我不确定我应该采用哪种快速修复建议:
我还想知道,为什么不能使用 savedInstanceState - 在将数据从 Activity 传递到 Fragment 时,我真的需要创建一个新的 Bundle 对象吗?
【问题讨论】:
-
可以在fragment的构造函数中传入,赋值给变量。
标签: android android-fragments android-arrayadapter listadapter android-bundle