使用Tablayout&Viewpager保存webview状态的逻辑
问题描述:
当滚动viewpager/tablayout时,我只能保留webview的状态。我到目前为止尝试的步骤是savedInstanceState
,这不起作用。我希望它能像Chrome那样工作,我可以回到标签页,并且webveiw仍然处于保存状态使用Tablayout&Viewpager保存webview状态的逻辑
我希望有人能够建议我或帮助我解决这个问题。
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);
}
}
这是我使用Tablayout &查看传呼机的活动。每次我滑回到包含片段的前一个选项卡时,其中包含的webview将重新加载。
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) {
}
});
这是一个扩展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);
}
}
}
答
考虑使用FragmentStaePagerAdapter
适配器它可以帮助你https://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter.html
你是不是叫[saveState和/ restoreState](https://developer.android .com/reference/android/webkit/WebView.html#saveState(android.os.Bundle))和restoreState在任何地方,为什么你会期望它的工作? – EpicPandaForce
@EpicPandaForce我很抱歉,因为它不适合我,所以我懒得把它放在代码中。不过,我已经重新添加了代码。你可以看一下吗? – choman
你应该把webViewBundle放到带有'putBundle'的保存实例状态包中,然后用'getBundle'获取它。 – EpicPandaForce