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

时间:2012-09-04 15:27:18

标签: 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);
    }
}

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

修改 在activity-oncreate中,setOffscreenPageLimit设置为3

 viewPager.setOffscreenPageLimit(3);

要指出问题所在,我在YouTube

上制作了一个小视频

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

3 个答案:

答案 0 :(得分:5)

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

webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

请参阅WebView inside ViewPager or ScrollView - weird rendering bug on Android 3.0+

答案 1 :(得分: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);
            }
        }
     }

你需要检查你是来自右边还是左边,并根据这个滚动-1或1像素(你来自的页面将保留在内存中,所以你不需要重新加载那个)。只有在第一个滚动(打开应用程序后),上述问题仍然存在。

缺点:如果你仔细观察,你可以看到页面滚动1个像素。

有一个比我更多时间的人可以深入研究android代码,看看当1个像素进入屏幕时究竟发生了什么,并模仿了这种行为。

答案 2 :(得分:0)

在清单文件

中为您的应用程序设置此属性

机器人:硬件加速= “假”