0

在配置更改时,我在 FragmentActivity onSaveInstanceState 中执行此操作:

    getSupportFragmentManager().putFragment(outState,"fred",fred);

其中 fred 是我的 setRetainInstance(true) 片段。

然后在我的 FragmentActivity onRestoreInstanceState 我这样做:

    fred = getSupportFragmentManager().getFragment(inState,"fred");

根据这个问题的建议:When to use FragmentManager::putFragment and getFragment

其中 fred 在全局范围内定义如下:

 android.support.v4.app.Fragment fred=null;

我想从我的 FragmentActivity 中的不同方法(即不是来自 onRestoreInstanceState)中调用 fred 中的方法,我这样做是这样的:

    ((fred) fred).somemethod(); 

在方向改变之前工作正常。但是,在方向更改后,我遇到了 classCastExceptions,其中提到了我的 FragmentActivity (harry, bert etc) 中的其他片段。这些错误的原因可能是片段管理器已用于在 onRestoreInstanceState 之后附加/分离 harry 和 bert 片段。

我已经确认我的片段 fred 实际上被保留了(我从中写出调试日志消息)。我相当确定我的问题是我只需要像这样进行一些片段管理器调用:

fred fragment = (fred) getSupportFragmentManager().findFragmentByTag("fred");

在调用 fred 中的方法之前。但是,无论我尝试什么都只会返回 null。

我已经为此工作了很长时间,非常欢迎任何建议或可能的询问方式。

更新:我没有完全实现接受的解决方案,但它让我意识到我必须实例化 fred,即使它是一个保留的片段。即我实际上解决这个问题的方法是像这样执行我的方法调用:

    fred fragment = (fred) getSupportFragmentManager().findFragmentByTag("fred");
    if (fragment==null){
       fragment = new fred();               //this is what I had been missing
    }

    ((fred) fred).somemethod(); 
4

1 回答 1

1

你可以这样做:

android.support.v4.app.Fragment fred = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    FragmentManager fm = getFragmentManager();
    fred = (TaskFragment) fm.findFragmentByTag("fredFrag");

    // if fred is null it means it is first time created activity
    // so we add fragment to activity
    // else fragment was added to activity and is 
    // retained across a configuration change.
    if (fred == null) {
        fred = new Fragment();
        fm.beginTransaction().add(mTaskFragment, "fredFrag").commit();
    }
}
于 2013-07-15T22:33:08.863 回答