在显示页面之前,不会加载/呈现ViewPager中的WebView

Mat*_*ate 7 android webview android-viewpager

我使用带有许多WebView的ViewPager,它用于显示ePub.我的问题是WebViews只是渲染/加载(我不太确定),因为它们的相应页面变得可见.在此之后,页面不需要重新呈现,直到它从ViewPagerAdapter中销毁.结果是,有一段时间总是有一个白页.如何将其滚动的页面预渲染到下一个webView(之前未呈现).

这是我的PagerAdapter:

public class MagazineReaderPagerAdapter extends PagerAdapter {

    private MagazineReaderActivity activity;
    private EpubDocument epub;

    public MagazineReaderPagerAdapter(Context ctx, EpubDocument epub)
    {
        activity = (MagazineReaderActivity) ctx;
        this.epub = epub;
    }

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

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        ReaderWebViewMulti view = new ReaderWebViewMulti(activity);
        view.loadContentDocument(epub.getContentDocuments().get(position), epub);

        ((ViewPager) container).addView(view, 0);
        return view;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view.equals(object);
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        ((ViewPager) container).removeView((View) object);
    }
}
Run Code Online (Sandbox Code Playgroud)

ReaderWebViewMulti从WebView ind扩展实现了一个方法loadContentDocument,它通过loadDataWithBaseURL加载内容.

编辑: 在activity-oncreate中,setOffscreenPageLimit设置为3

 viewPager.setOffscreenPageLimit(3);
Run Code Online (Sandbox Code Playgroud)

为了指出问题所在,我在YouTube上制作了一个小视频

从第二个4开始,您可以看到每个页面在已经可见时才会被渲染.当我回去时一切都很好.

小智 5

我遇到了同样的问题并通过禁用Web视图的硬件加速来修复它:

webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
Run Code Online (Sandbox Code Playgroud)

请参阅ViewPager或ScrollView中的WebView - Android 3.0+上的奇怪渲染错误


Fra*_*ank 0

我对此提出了一些想法。将屏幕滚动 1 像素将呈现正确的页面:

   class SomeClass implements OnPageChangeListener {

        private ViewPager viewPager;

        ...

        viewPager = ...
        viewPager.setOnPageChangeListener(this);

        ...

        @Override
        public void onPageScrollStateChanged(int state) {

            if (state == ViewPager.SCROLL_STATE_IDLE) {
                // viewpager finished scrolling to a page

                viewPager.scrollBy(1, 0);
            }
        }
     }
Run Code Online (Sandbox Code Playgroud)

您需要检查您是从右还是从左来,并根据此滚动 -1 或 1 像素(您来自的页面将保留在内存中,因此您不需要重新加载该页面)。仅在第一次滚动时(打开应用程序后),上述问题仍然存在。

缺点:如果你仔细观察的话,你会看到页面滚动了 1 个像素。

比我有更多时间的人可以深入研究 Android 代码,看看当 1 个像素进入屏幕时到底发生了什么,并模仿其中的一些行为。