2016-07-24 5 views
0

viewpager/tablayoutをスクロールするときに、webviewの状態を保持できません。これまでに試した手順はsavedInstanceStateですが動作しません。私はそれがクロムのように働きたいと思っています。ここでタブに戻ることができ、webveiwはまだ保存状態です。TablayoutとViewpagerでWebビューの状態を保存するロジック

誰かが私に示唆したり、助けてくれることを願っています。

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); 

      } 
     } 


    } 
+0

を助けるかもしれないFragmentStaePagerAdapterを使用することを考えてみましょう.com/reference/android/webkit/WebView.html#saveState(android.os.Bundle))and restoreStateどこにいても、なぜそれが動作すると思いますか? – EpicPandaForce

+0

@EpicPandaForce申し訳ありませんが、それは私のために働かなかったので、私はコードに配置する気にしませんでした。しかし、私はコードを追加しました。どうぞご覧ください。 – choman

+0

webViewBundleを 'putBundle'を使ってインスタンスインスタンスの保存バンドルに入れ、' getBundle'で取得してください。 – EpicPandaForce

答えて

0

を延長するアダプタであるあなたは(https://developer.android [ステートセーブ/ restoreState]呼び出しされていない、それはあなたにhttps://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter.html

+0

これは既に使用しています。 – choman

+0

本当にこれは正しいことですか? –

+0

はい、FragmentStatePagerAdapterを使用しても、webviewが更新されます。おそらく、それは 'tabLayout.setOnTabSelectedListener(on)のonTabSelected'メソッドと' onTabUnselected'メソッドから処理される必要があります(新しいTabLayout.OnTabSelectedListener(){' – choman

関連する問題