我正在尝试关注this idea for tabs with fragments以使FragmentActivity托管两个Fragment选项卡。另外,我在FragmentActivity上有一个按钮,它调用Activity上的startActivityForResult()来将项目添加到其中一个子Fragment选项卡。
问题是,当Activity完成时,FragmentActivity上的回调onActivityResult()代码抛出了
“java.lang.RuntimeException:传递结果失败 ResultInfo {who = null,request = 1,result = -1,data = Intent {(有额外的) to activity:java.lang.IllegalStateException:无法执行此操作 onSaveInstanceState之后的动作。“
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if (resultCode == RESULT_OK) {
MyData d = data.getParcelableExtra("data");
FragmentManager fm = getSupportFragmentManager();
if (fm.findFragmentByTag(id) == null) {
fm.beginTransaction().replace(R.id.<my_container>, new MyFragment(), id)
.commitAllowingStateLoss();
}
MyFragment f = (MyFragment)fm.findFragmentByTag(id);
f.addData(d);
}
}
}
这里的问题是第二次调用fm.findFragmentByTag(id)后f为null。我也试过调用mTabsAdapter.getItem(mTabHost.getCurrentTab());但是返回一个Fragment,其中的ArrayAdapter为null。
我确定我做错了什么但是弄不清楚是什么。有些人可以向我解释我该如何处理这种情况?
谢谢。
答案 0 :(得分:0)
好的,这就是我解决这个问题的方法,以防有人遇到类似事情。
最初我是从托管标签的FragmentActivity调用startActivityForResult(),而不是从一个Fragment类中选择“tabbed”。所以现在首先我将菜单项添加到Fragment:
的操作栏中@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// Inflate the menu; this adds items to the action bar if it is present.
inflater.inflate(R.menu.add_rule, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
if (item.getItemId() == R.id.menu_new) {
Intent i = new Intent(this.getActivity(), MyActivity.class);
startActivityForResult(i, 1);
return true;
} else {
return super.onOptionsItemSelected(item);
}
}
这里要注意三点:1)方法签名不同于一个Activity,覆盖Fragment的相应方法; 2)你必须在最后调用super.onCreateOptionsMenu; 3)你必须添加setHasOptionsMenu(true);到片段的onAttach调用。
接下来,通常在Fragment的onActivityResult(...)方法上实现返回代码。唯一的区别是你必须覆盖托管FragmentActivity上的方法并在那里调用super。这是为了确保调用Fragment.onActivityResult。
在将这些逻辑从FragmentActivity转移到Fragment之后,一切都运行良好。