6

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

1 回答 1

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,每次都会调用片段的createview()。尝试像上面的代码那样使用 add() 。

于 2014-11-15T07:33:57.730 回答