Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当从NavigationDrawer中选择时,如何防止碎片复制?_Android_Android Fragments_Android Webview_Navigation Drawer - Fatal编程技术网

Android 当从NavigationDrawer中选择时,如何防止碎片复制?

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

我有一个简单的活动,其中有一个导航抽屉。其中一个条目是WebView,它需要很多时间才能加载(它显示Gmail,所以遵循这些讨厌的重定向需要很多时间)

即使出现不同的选择,我也希望保留片段。我认为这些解决方案可能有效。他们没有

1) 不重新创建片段:即使mWebmailFragment实际上是非null,在任何情况下都会调用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总是空的。我不知道为什么

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());