0

我正在尝试对带有片段的选项卡遵循这个想法,以使 FragmentActivity 托管两个 Fragment 选项卡。此外,我在 FragmentActivity 上有一个按钮,该按钮在 Activity 上调用 startActivityForResult() 以将项目添加到子 Fragment 选项卡之一。

问题是,当 Activity 完成时,FragmentActivity 上的回调 onActivityResult() 代码会抛出一个

“java.lang.RuntimeException: 将结果 ResultInfo{who=null, request=1, result=-1, data=Intent { (has extras) }} 传递给活动失败: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 为空。我也尝试调用 mTab​​sAdapter.getItem(mTabHost.getCurrentTab()); 但这会返回一个 Fragment,其中的 ArrayAdapter 为空。

我确定我做错了什么,但不知道是什么。有人可以向我解释我应该如何处理这种情况吗?

谢谢你。

4

1 回答 1

0

好的,这就是我解决这个问题的方法,以防有人遇到类似的事情。

最初我是从托管选项卡的 FragmentActivity 调用 startActivityForResult() ,而不是从“选项卡”的 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); 到 Fragment 的 onAttach 调用。

接下来,在 Fragment 的 onActivityResult(...) 方法上正常实现您的返回代码。唯一的区别是您还必须覆盖托管 FragmentActivity 上的方法并在那里调用 super 。这是为了确保调用 Fragment.onActivityResult。

在将逻辑从 FragmentActivity 转移到 Fragment 之后,一切正常。

于 2013-10-17T08:04:18.403 回答