在配置更改中,我在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();
答案 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();
}
}