我有一个简单的活动,它托管了一个导航抽屉。其中一个条目是WebView,它需要大量的负载(它显示Gmail,因此所有那些令人讨厌的重定向需要花费很多)。
即使发生不同的选择,我也想保留片段。我认为这些解决方案可能会奏效。他们没有。
1)不重新创建片段:即使mWebmailFragment 实际 非空,在任何情况下都会调用onCreateView()。
private Fragment mWebmailFragment /*, the others */;
public void selectItem(int position) {
Fragment fragment = null;
switch (position) {
case FRAGMENT_CODE_WEBMAIL:
mWebmailFragment = mWebmailFragment!=null ? mWebmailFragment : new WebmailFragment();
fragment = mWebmailFragment;
break;
// ...
}
2)如果调用onCreateView(),保留WebView对象状态可能有效。好吧,它没有:调试我发现savedInstanceState 总是 null。我不知道为什么。
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
// Retain instance
setRetainInstance(true);
//....
// SavedState
if (savedInstanceState != null) {
mWebView.restoreState(savedInstanceState);
} else {
// do stuff
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mWebView.saveState(outState);
}
答案 0 :(得分:0)
我认为您没有正确使用隐藏/显示。在您的片段事务中,使用add()来加载片段而不是replace()。
更改此
final FragmentManager myFragmentManger = myContext
.getSupportFragmentManager();
final FragmentTransaction myFragmentTransaction = myFragmentManger
.beginTransaction();
myFragmentTransaction.replace(R.id.content, aFragment,
aFragmentTag.getFragment());
到
final FragmentManager myFragmentManger = myContext
.getSupportFragmentManager();
final FragmentTransaction myFragmentTransaction = myFragmentManger
.beginTransaction();
myFragmentTransaction.add(R.id.content, aFragment,
aFragmentTag.getFragment());
如果使用replace,则每次都会调用fragment的createview()。尝试使用上面代码中的add()。