在Fragment中保存WebView的状态

3
我希望能够在Fragment中保留Webview的状态。我的需求是,当我通过导航抽屉切换Fragment时,在我的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;
    }
        
}
2个回答

3

在BottomNavigationView中使用Webview

我正在一个Fragments中使用Webview,并且该Fragments是在BottomViewNavigation中的。@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
您可以将此方法添加到片段(Fragment)中,方法如下:
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
@user2900523 我也发现当保存和恢复webview状态时,我的应用程序稳定性急剧下降。内部经常崩溃。你找到解决方案了吗?谢谢。 - MeatPopsicle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接