6

在一周的大部分时间里,我一直在尝试这样做,但仍然没有运气。

我有一个带有标签的操作栏(操作栏 sherlock),我在标签之间切换并很好地更改片段。

每个片段都有一个 webview,我试图保存 webview 的状态,以便网页保持在用户离开它的同一页面上。

这是我的片段代码:

public class FragmentB extends SherlockFragment {

WebView myWebView;

@Override
public void onSaveInstanceState(Bundle outState) {
   super.onSaveInstanceState(outState);
   myWebView.saveState(outState);
   Log.w("///////", "onSaveInstanceState");

}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
   super.onActivityCreated(savedInstanceState);
   myWebView.restoreState(savedInstanceState);
   Log.w("///////", "onActivityCreated");

}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.w("///////", "onCreate");
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

     View mainView = (View) inflater.inflate(R.layout.frag_b, container, false);
     myWebView = (WebView) mainView.findViewById(R.id.webview);


     Log.w("///////", "onCreateView");


     if (savedInstanceState != null){

         myWebView.restoreState(savedInstanceState);
         Log.w("///////", "restore!");
     }
     else{
         Log.w("///////", "ELSE!");
         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.google.com");   
     }



    //return inflater.inflate(R.layout.frag_b, container, false);
    return mainView;
}

public class MyWebViewClient extends WebViewClient {        

    @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);
        }
    }

}

}

任何帮助都会很棒!

4

1 回答 1

4

Fragment的onSaveInstanceState方法只会在父Activity需要保存状态时被调用;这方面的一个例子是在方向更改期间父活动被破坏/重新创建时。因此,当您只是替换片段或在它们之间作为选项卡切换时,不会调用此方法。

作为针对您的特定情况的解决方法,您可以将 webview 的状态保存在方法中的捆绑包中,并在onPause方法中恢复它onActivityCreated

    // Instance fields        
    private WebView webView;
    private Bundle webViewBundle;

    /**
     * Save the state of the webview
     */
    @Override
    public void onPause()
    {
        super.onPause();

        webViewBundle = new Bundle();
        webView.saveState(webViewBundle);
    }

    /**
     * Restore the state of the webview
     */
    @Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);

        if (webViewBundle != null)
        {
            webView.restoreState(webViewBundle);
        }
    }

另请参阅此处以获取更多信息:

如何在操作栏的片段中保存 WebView 的状态

于 2013-04-30T06:45:32.793 回答