从NavigationDrawer中选择时如何防止碎片重新创建?

时间:2013-11-01 09:52:21

标签: android android-fragments android-webview navigation-drawer

我有一个简单的活动,它托管了一个导航抽屉。其中一个条目是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);
}

1 个答案:

答案 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()。