从另一个startActivityForResult()返回后,将数据传递到选项卡式FragmentActivity的一部分中的Fragment

时间:2013-10-16 16:38:47

标签: android tabs android-fragments

我正在尝试关注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。

我确定我做错了什么但是弄不清楚是什么。有些人可以向我解释我该如何处理这种情况?

谢谢。

1 个答案:

答案 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之后,一切都运行良好。