我有一个 fragment 课。下面是它:

public class FragmentA extends Fragment {

Button button;
WebView myWebView;
int mCurCheckPosition;

 @Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);

 }

 @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("curChoice", mCurCheckPosition);
    }

 @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    if (savedInstanceState != null) {
            // Restore last state for checked position.
            mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
        }
}



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved)
{
     View mainView = (View) inflater.inflate(R.layout.frag_a, group, false);
     myWebView = (WebView) mainView.findViewById(R.id.webview);
    myWebView.setWebViewClient(new MyWebViewClient());
    myWebView.getSettings().setPluginsEnabled(true);
    myWebView.getSettings().setBuiltInZoomControls(false);
    myWebView.getSettings().setSupportZoom(false);
    myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    myWebView.getSettings().setAllowFileAccess(true);
    myWebView.getSettings().setDomStorageEnabled(true);
    myWebView.loadUrl("http://www.bbc.co.uk");
    return mainView;
}


public class MyWebViewClient extends WebViewClient {
    /* (non-Java doc)
     * @see android.webkit.WebViewClient#shouldOverrideUrlLoading(android.webkit.WebView, java.lang.String)
     */


    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.endsWith(".mp4"))
        {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(Uri.parse(url), "video/*");

            view.getContext().startActivity(intent);
            return true;
        }
        else {
            return super.shouldOverrideUrlLoading(view, url);
        }
    }

}

}

问题是,当我在另一个 fragment 之间来回移动时,原始 fragment 的状态(它所在的网页)丢失了。

我该如何预防呢?我希望网页的状态保持在每个 fragment 之间来回切换。

谢谢

最佳答案

您应该在onSaveInstanceState(Bundle outState)方法中使用WebView.saveState(Bundle state)方法,然后在onActivityCreated(Bundle savedInstanceState)方法中使用WebView.restoreState(Bundle state)恢复状态。

@Override
public void onSaveInstanceState(Bundle outState) {
   super.onSaveInstanceState(outState);
   mWebView.saveState(outState);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
   super.onActivityCreated(savedInstanceState);
   mWebView.restoreState(savedInstanceState);
}

还请记住 fragment 生命周期。如果不确定状态的恢复位置(onCreate,onCreateView,onActivityCreated),请查看Fragment Lifecycle文档以找出正确的位置。
http://developer.android.com/guide/components/fragments.html

onCreate()

创建 fragment 时,系统将调用此方法。在实现中,您应该初始化要暂停或停止然后恢复的 fragment 要保留的 fragment 的基本组件。

onCreateView()

当 fragment 第一次绘制其用户界面时,系统将调用此方法。要为 fragment 绘制UI,必须从此方法返回一个View,它是 fragment 布局的根。如果该 fragment 不提供UI,则可以返回null。

onActivityCreated()

在创建 fragment 的 Activity 并实例化此 fragment 的 View 层次结构时调用。一旦这些部分就位,就可以用来进行最终初始化,例如检索 View 或还原状态。这对于使用setRetainInstance(boolean)保留其实例的 fragment 也很有用,因为此回调告诉 fragment 何时将其与新的 Activity 实例完全关联。在onCreateView(LayoutInflater,ViewGroup,Bundle)之后和onStart()之前调用此方法。

关于android - 保存 fragment 状态?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11798620/

10-13 04:14