在 Fragment 中保存状态 WebView

Posted

技术标签:

【中文标题】在 Fragment 中保存状态 WebView【英文标题】:Save state WebView in Fragment 【发布时间】:2013-12-06 03:28:15 【问题描述】:

我想要在 Fragment 中保存状态的 webview。我想要的是。当我通过导航抽屉切换片段时,我想将我的 webview 的状态保存在片段中。我找到了一些代码来保存状态,但实际上我不知道在哪里写它。有人可以帮我吗?对不起我的英语。

这是保存状态的代码

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


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

这是我的代码

public class Zastupovanie extends SherlockFragment

    private Context context;
        
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved)

        View v = inflater.inflate(R.layout.zastupovanie, group, false);
        final ProgressDialog pd = ProgressDialog.show(getActivity(),  "", "Prosím čakajte. Prebieha načítavanie... ", true);
    
        final WebView myWebView = (WebView) v.findViewById(R.id.zastupovanie2);
        myWebView.setWebViewClient(new WebViewClient() 
            @Override
            public void onPageFinished(WebView view, String url) 
                pd.dismiss();
            
        );
    
        myWebView.getSettings().setBuiltInZoomControls(false); 
        myWebView.getSettings().setSupportZoom(false);
        myWebView.getSettings()
           .setjavascriptCanOpenWindowsAutomatically(true);   
        myWebView.getSettings().setJavaScriptEnabled(true);
        myWebView.getSettings().setAllowFileAccess(true); 
        myWebView.getSettings().setDomStorageEnabled(true);
        myWebView.getSettings().setDefaultZoom(ZoomDensity.FAR);      
        myWebView
            .loadUrl("http://soszm.edupage.org/substitution/?");
    
        return v;
    
        

【问题讨论】:

【参考方案1】:

BottomNavigationView 中的Webview

我在 BottomViewNavigation 的一个片段中使用 web-view。 @Rafael T 提供的解决方案是一个可靠的解决方案。但是当您导航到 BottomNavigationView 中的另一个 Fragment 时,不会调用 onSaveInstanceState()。于是我就这样保存并恢复了Webview的状态。

class MyFragment extends Fragment 

    private Bundle webviewstate;
    private Webview mywebview;

    // Saving state
    @Override
    public void onPause()
       super.onPause();
       webviewstate = new Bundle();
       mywebview.saveState(webviewstate);
    

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

       if(webviewstate==null)
            myWebView.loadUrl("http://soszm.edupage.org/substitution/?");  //Load the page for first time
       else
            myWebView.restoreState(webviewstate);    // Restore the state
       

    


【讨论】:

【参考方案2】:

您可以像这样简单地将这个方法添加到您的片段中:

public class Zastupovanie extends SherlockFragment

    Context context;
    private WebView myWebView

    @Override
    public void onSaveInstanceState(Bundle outState) 
        super.onSaveInstanceState(outState);
        myWebView.saveState(outState);
    

    @Override
    public void onActivityCreated(Bundle savedInstanceState) 
        super.onActivityCreated(savedInstanceState);
        myWebView.restoreState(savedInstanceState);
    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved)
        
        View v = inflater.inflate(R.layout.zastupovanie, group, false);
        final ProgressDialog pd = ProgressDialog.show(getActivity(),  "", "Prosím čakajte. Prebieha načítavanie... ", true);

        myWebView = (WebView) v.findViewById(R.id.zastupovanie2);
        myWebView.setWebViewClient(new WebViewClient() 
            @Override
            public void onPageFinished(WebView view, String url) 
                pd.dismiss();
            
        );

        myWebView.getSettings().setBuiltInZoomControls(false); 
        myWebView.getSettings().setSupportZoom(false);
        myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);   
        myWebView.getSettings().setJavaScriptEnabled(true);
        myWebView.getSettings().setAllowFileAccess(true); 
        myWebView.getSettings().setDomStorageEnabled(true);

        myWebView.getSettings().setDefaultZoom(ZoomDensity.FAR);

        myWebView.loadUrl("http://soszm.edupage.org/substitution/?");

        return v;
        

    

【讨论】:

谢谢,它运行良好:) 但有时应用程序崩溃,但可能是因为 RAM 或有什么问题? @user2900523 我还发现我的应用程序稳定性在保存和恢复 webview 状态时急剧下降。内部崩溃很多。你有没有找到解决办法?谢谢

以上是关于在 Fragment 中保存状态 WebView的主要内容,如果未能解决你的问题,请参考以下文章

我踩到的关于Fragment 状态的保存和恢复的坑

android的Fragment切换时如何保存状态?

android的Fragment切换时如何保存状态?

Android开发实战篇 ViewPager中切换及滑动切换Fragment数据保存状态

Fragment的实际开发中总结

解决APP中fragment重叠问题