WebView reloading when Fragment in ViewPager is retained form BackStack

前端 未结 3 1066
Happy的楠姐
Happy的楠姐 2020-12-15 06:04

Here is a code for a basic Fragment which contains a WebView.
WebFragment.java

public class WebFragment exte         


        
相关标签:
3条回答
  • 2020-12-15 06:09

    Well for fragments use like this.

    A extends Fragment
    
    {
    
       static  WebView w;
    
       View v;
    
       private Handler handler = new Handler(){
    
        @Override
        public void handleMessage(Message message) {
    
            switch (message.what) {
                case 1:{
                    webViewGoBack();
                }break;
            }
        }
    
        private void webViewGoBack() {
            w.goBack();
    
            // TODO Auto-generated method stub
    
        }
    };
    
    @Override
    
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle    savedInstanceState){
    
     v = inflater.inflate(R.layout.webs, container, false);
    
     w=(WebView)v.findViewById(R.id.webView1);
    
    //w.loadUrl("");
    
    }
    
     w.setOnKeyListener(new OnKeyListener(){
    
     @Override
    
     public boolean onKey(View v, int keyCode, KeyEvent event) {
    
                // TODO Auto-generated method stub
       if((keyCode==KeyEvent.KEYCODE_BACK)&& w.canGoBack())
    
                {
    
                    handler.sendEmptyMessage(1);
    
                    return true;
    
                }
                return false;
            }
    
         });
    
    0 讨论(0)
  • 2020-12-15 06:19

    This is a classic case of falling victim to the easy patch-fix of overriding android:configChanges to solve a problem. Unfortunately there are multiple reasons why a config change will occur. So simply catching for a screen size change will miss a lot of them...as you have discovered.

    First, completely remove android:configChanges. Then add the following to your WebView fragment.

    protected void onSaveInstanceState(Bundle outState) {
      webView.saveState(outState);
    }
    

    Adjust your WebView fragment's onActivityCreated method to include the following:

    public void onActivityCreated(Bundle savedInstanceState) {
        webView = (WebView) getView().findViewById(R.id.helloWebview);
        initWebView();
    
        if (savedInstanceState != null)
            webView.restoreState(savedInstanceState);
        else
            webView.loadUrl(currentUrl);
    

    }

    That should get you going in the right direction. Note, calling a WebView's saveState() will not save display data. Eg, input tags will not perserve user input. You'll need to parse through the webpage manually to persist that data. Depending on what you are using the WebView for, this will be a major pain.

    0 讨论(0)
  • 2020-12-15 06:30

    In your main activity where you have defined viewpager

    after the declaration of viewpager like this line : ViewPager viewpager = (ViewPager) findViewById(R.id.pager);

    add this line :

    viewpager.setOffscreenPageLimit(2);
    

    This will prevent your fragment from recreated upto swipe of two screens,so when you will return from 3rd page to 1st page in viewpager,your webview will not reload.

    0 讨论(0)
提交回复
热议问题