在配置更改时,我在 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();