如何在方向更改后将(Sherlock)FragmentActivity重新连接到保留的片段

时间:2013-07-15 20:18:54

标签: android orientation fragment

在配置更改中,我在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中的不同方法调用fred中的方法(即不是来自onRestoreInstanceState),我喜欢这样:

    ((fred) fred).somemethod(); 

在方向改变之前工作正常。但是,在方向改变之后,我遇到了classCastExceptions,它提到了我的FragmentActivity中的其他片段(harry,bert等)。该 造成这些错误的原因可能是片段管理器已用于在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(); 

1 个答案:

答案 0 :(得分: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();
    }
}