使 webview 在带有大量片段的 tablayout 中只加载一次

make webview load only one time in tablayout with lots of fragment

我正在使用带有 5 个片段的选项卡布局。每个片段都有 webview 和唯一的 web link。我 select 选项卡的时间一切正常。但是当我重新访问在重新加载之前完成加载的同一个选项卡时。 有什么原因可以将内容保存在片段中,以便我只需要加载片段 link 一次。

我的代码

    public class MainActivity extends AppCompatActivity {
        TabLayout tabLayout;
        ViewPager viewPager;
        private int[] tabIcons = {
                R.drawable.ic_tab_1,
            R.drawable.ic_tab_2,
            R.drawable.ic_tab_3,
            R.drawable.ic_tab_4,
            R.drawable.ic_tab_5,
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);
        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
        setupTabIcons();
    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new Fragment1(),"1");
        adapter.addFragment(new Fragment2(), "2");
        adapter.addFragment(new Fragment3(),"3");
        adapter.addFragment(new Fragment4(), "4");
        adapter.addFragment(new Fragment5(), "5");
        viewPager.setAdapter(adapter);
    }

    private void setupTabIcons() {
        tabLayout.getTabAt(0).setIcon(tabIcons[0]);
        tabLayout.getTabAt(1).setIcon(tabIcons[1]);
        tabLayout.getTabAt(2).setIcon(tabIcons[2]);
        tabLayout.getTabAt(3).setIcon(tabIcons[3]);
        tabLayout.getTabAt(4).setIcon(tabIcons[4]);
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return null;
        }
    }
}

片段是

public class Fragment1 extends Fragment {
    WebView web;
    private SmoothProgressBar mProgressBar;
    private SwipeRefreshLayout mySwipeRefreshLayout;

    public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle saveInstanceState) {
        View view = inflater.inflate(R.layout.fragment_1, viewGroup, false);
        web = (WebView) view.findViewById(R.id.id_web);
        mProgressBar = (SmoothProgressBar)view.findViewById(R.id.google_now);

        mySwipeRefreshLayout = (SwipeRefreshLayout)view.findViewById(R.id.swipeContainer);
        mySwipeRefreshLayout.setOnRefreshListener(
                new SwipeRefreshLayout.OnRefreshListener() {
                    @Override
                    public void onRefresh() {
                        web.reload();
                    }
                }
        );
        loadingThePage();
        return view;
    }
    private void loadingThePage(){
        web.setWebViewClient(new myWebClient());
        web.getSettings().setJavaScriptEnabled(true);
        web.getSettings().setAppCacheEnabled(true);
        web.loadUrl("https://www.google.com/");
    }


    public class myWebClient extends WebViewClient {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            // TODO Auto-generated method stub
            super.onPageStarted(view, url, favicon);
            mySwipeRefreshLayout.setRefreshing(false);
            mProgressBar.progressiveStart();
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            // TODO Auto-generated method stub
            view.loadUrl(url);
            return true;
        }

        @Override
        public void onReceivedError(WebView view, WebResourceRequest request, 
 WebResourceError error) {
            super.onReceivedError(view, request, error);
            mySwipeRefreshLayout.setRefreshing(false);
            mProgressBar.progressiveStop();
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            mySwipeRefreshLayout.setRefreshing(false);
            mProgressBar.progressiveStop();
        }
    }
}

您要找的是:

viewPager.setOffScreenPageLimit(5);

通过调用它,您可以覆盖 ViewPager 的默认行为,该行为将左右页面和当前页面保留在内存中。不过在使用时要小心。你通常不应该在内存中保留比默认更多的页面。