简体   繁体   中英

Logic to save webview state with Tablayout & Viewpager

I am just not able to retain the state of a webview when scrolling thru viewpager /tablayout. The steps I so far tried is savedInstanceState which doesn't work. I want to have it work like that of chrome where i can go back to a tab and the webveiw is still in its saved state

I hope someone could suggest me or help me out on this.

 public class stackOverflow extends Fragment {


  private WebView webView;
  private ProgressBar progressBar1;
  private SwipeRefreshLayout mSwipeRefreshLayout1;
  private Bundle webViewBundle;



  public stackOverflow() {
   // Required empty public constructor
  }


  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
   Bundle savedInstanceState) {
   // Inflate the layout for this fragment


   return inflater.inflate(R.layout.fragment_tab1, container, false);


  }



  @Override
  public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {


   progressBar1 = (ProgressBar) view.findViewById(R.id.progressBar1);

   webView = (WebView) view.findViewById(R.id.website_detail_1);

   webView.setWebViewClient(new MyAppWebViewClient());
   webView.getSettings().setJavaScriptEnabled(true);
   webView.getSettings().setDomStorageEnabled(true);

   if (savedInstanceState != null)
    webview.restoreState(savedInstanceState);
   else


    webView.loadUrl("http://www.stackoverflow.com");


   WebSettings webSettings = webView.getSettings();

   webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
   webView.getSettings().setAppCacheEnabled(true);
   webSettings.setDomStorageEnabled(true);

   webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);


   mSwipeRefreshLayout1 = (SwipeRefreshLayout) view.findViewById(R.id.swipe1);
   mSwipeRefreshLayout1.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
     webView.loadUrl("http://www.stackoverflow.com");
    }
   });

   if (mSwipeRefreshLayout1.isRefreshing()) {
    mSwipeRefreshLayout1.setRefreshing(false);
   }


   webView.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
     if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
      webView.goBack();
      return true;
     }

     return false;
    }
   });

  }

  public class MyAppWebViewClient extends WebViewClient {

   @Override
   public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);
    //view.findViewById(R.id.progressBar1).setVisibility(View.GONE);
    Log.i("pageFinished", "yesss");
    //progressBar.setVisibility(View.INVISIBLE);
    progressBar1.setVisibility(View.GONE);


    if (mSwipeRefreshLayout1.isRefreshing()) {
     mSwipeRefreshLayout1.setRefreshing(false);
    }


   }

   @Override
   public void onPageStarted(WebView view, String url, Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
   }


   @Override
   public boolean shouldOverrideUrlLoading(WebView view, String url) {
    view.loadUrl(url);
    return true;
   }


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

  @Override public void onPause() {
   super.onPause();

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

 }

This is the Activity where I am using Tablayout & View pager. Every time I swipe back to my previous tab which holds the fragment, the webview that's contained in it will reload.

TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
tabLayout.addTab(tabLayout.newTab().setText("WebView1").setTag("WebView1"));
//all the way down to .....
tabLayout.addTab(tabLayout.newTab().setText("WebView13").setTag("WebView13"));        

        final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
        viewPager.setOffscreenPageLimit(6);


        final PagerAdapter adapter = new TabPagerAdapter(getSupportFragmentManager(), tabLayout
                .getTabCount());
        viewPager.setAdapter(adapter);

        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(
                tabLayout));
        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

This is the adapter that extends FragmentStatePagerAdapter

public class TabPagerAdapter extends FragmentStatePagerAdapter {


        private List<Fragment> mFragmentList;


        @Override
        public int getItemPosition(Object object) {
            return PagerAdapter.POSITION_NONE;
        }

        @Override
        public Fragment getItem(int position) {

            return mFragmentList.get(position);
        }

        public TabPagerAdapter(FragmentManager fm, List<Fragment> fragmentList) {
            super(fm);
            mFragmentList = fragmentList;
        }

        @Override
        public int getCount() {

            return mFragmentList.size();
        }

        public void removeFragment(int tabPosition) {

            if (!mFragmentList.isEmpty()) {
                mFragmentList.remove(tabPosition);

            }
        }


    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM