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