【问题标题】:WebViews in ViewPager are not loaded/rendered until page is shownViewPager 中的 WebView 在页面显示之前不会加载/渲染
【发布时间】:2015-07-01 20:42:05
【问题描述】:

我使用带有许多 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 扩展而来,实现了一个 loadContentDocument 方法,该方法通过 loadDataWithBaseURL 加载内容。

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

 viewPager.setOffscreenPageLimit(3);

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

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

【问题讨论】:

  • 当前设置的ViewPageroffscreenPageLimit 是什么?
  • 它设置为 3,我在文本中添加了这个
  • 我遇到了完全相同的问题...我调试并创建了屏幕外片段,但是当我滚动页面时,它只是在页面滚动之前不会显示:S
  • 嗨@Perroloco,你解决了你上面提到的问题了吗?我现在面临同样的问题,页面将在我滚动页面后呈现。
  • 不,我还没有找到解决方案:(

标签: android webview android-viewpager


【解决方案1】:

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

webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

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

【讨论】:

    【解决方案2】:

    我对此提出了一些想法。将屏幕滚动 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 个像素进入屏幕时到底发生了什么,并模仿其中的一些行为。

    【讨论】:

      【解决方案3】:

      在清单文件中为您的应用程序设置此属性

      android:hardwareAccelerated="false"

      【讨论】:

        最近更新 更多