Android 当从NavigationDrawer中选择时,如何防止碎片复制?
我有一个简单的活动,其中有一个导航抽屉。其中一个条目是WebView,它需要很多时间才能加载(它显示Gmail,所以遵循这些讨厌的重定向需要很多时间) 即使出现不同的选择,我也希望保留片段。我认为这些解决方案可能有效。他们没有 1) 不重新创建片段:即使mWebmailFragment实际上是非null,在任何情况下都会调用onCreateView()Android 当从NavigationDrawer中选择时,如何防止碎片复制?,android,android-fragments,android-webview,navigation-drawer,Android,Android Fragments,Android Webview,Navigation Drawer,我有一个简单的活动,其中有一个导航抽屉。其中一个条目是WebView,它需要很多时间才能加载(它显示Gmail,所以遵循这些讨厌的重定向需要很多时间) 即使出现不同的选择,我也希望保留片段。我认为这些解决方案可能有效。他们没有 1) 不重新创建片段:即使mWebmailFragment实际上是非null,在任何情况下都会调用onCreateView() private Fragment mWebmailFragment /*, the others */; public void sele
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总是空的。我不知道为什么
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);
}
我认为你没有正确地使用隐藏/显示。在片段事务中,使用add()加载片段,而不是replace() 改变这个
final FragmentManager myFragmentManger = myContext
.getSupportFragmentManager();
final FragmentTransaction myFragmentTransaction = myFragmentManger
.beginTransaction();
myFragmentTransaction.replace(R.id.content, aFragment,
aFragmentTag.getFragment());
到
如果使用replace,每次都会调用片段的createview()。尝试像上面的代码那样使用add()。当您选择另一个片段时,如何更改片段?如果你“替换”它们,也许可以尝试“show()”和“hide()”。你有没有找到解决方法?没有。。。我使用了“隐藏所有显示选定的”逻辑,但当方向发生变化时,一切都会一团糟。目前,我解决了将UI强制设置为纵向模式的问题,但您可以理解这是一个多大的限制。
final FragmentManager myFragmentManger = myContext
.getSupportFragmentManager();
final FragmentTransaction myFragmentTransaction = myFragmentManger
.beginTransaction();
myFragmentTransaction.add(R.id.content, aFragment,
aFragmentTag.getFragment());