WebViews en ViewPager no se cargan / representan hasta que se muestra la página

Yo uso un ViewPager con muchas WebViews, es para mostrar un ePub. Mi problema es que los WebViews son sólo renderizado / cargado (no estoy muy seguro) cuando su página correspondiente se vuelve visible. Después de esto, la página no necesita ser vuelto a renderizar hasta que se destruye desde ViewPagerAdapter. La consecuencia es que siempre hay una página en blanco por un tiempo. ¿Cómo puedo pre-procesar la página que se desplaza suave a próxima webView (que no se prestó antes).

Este es mi 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 se extiende desde WebView ind implementa un método loadContentDocument que carga el contenido a través de loadDataWithBaseURL.

Edit: En activity-oncreate el setOffscreenPageLimit se establece en 3

  viewPager.setOffscreenPageLimit(3); 

Para señalar cuál es el problema, hice un pequeño video en YouTube

Desde el segundo 4 se puede ver que cada página se representa sólo cuando ya está visible. Cuando vuelva todo está bien.

Tuve el mismo problema y lo arreglé desactivando la aceleración de hardware para la vista web:

 webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

Ver WebView dentro de ViewPager o ScrollView – extraño error de renderizado en Android 3.0+

Puse algunos pensamientos en esto. Desplazamiento de la pantalla de 1 píxel sería la página derecha:

  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); } } } 

Tendrías que comprobar si vienes de derecha o izquierda y de acuerdo con este desplazamiento de -1 o 1 píxeles (la página de donde vienes se quedará en la memoria, por lo que no es necesario volver a cargarla). Sólo en el primer desplazamiento (después de abrir la aplicación) el problema descrito anteriormente aún persistirá.

Desventaja: puede ver la página desplazándose 1 píxel, si se ve muy de cerca.

Alguien con más tiempo que yo podría bucear en el código de Android para ver qué sucede exactamente cuando 1 píxel entra en la pantalla, e imitar algunos de este comportamiento.

Establezca esta propiedad para su aplicación en el archivo de manifiesto

Android: hardwareAccelerated = "false"

  • Cómo deshabilitar el desplazamiento horizontal en la vista web de Android
  • LAYER_TYPE_SOFTWARE causa que WebView cargue la página en blanco
  • Cómo pasar un valor de cadena a webView de una actividad
  • La cookie de la webview de Android devuelve null
  • FilePicker desde android webview trabajando sólo una vez
  • Reproducción de un video local de aplicación (.mp4) en una vista web
  • Detectar si la página web se carga en la aplicación nativa de Facebook en iOS / Android
  • Cómo mostrar texto marathi en Android procedente de webservice
  • Consumir servicio REST Web y analizar datos XML en Android
  • No puedo conectarme a mi servicio web
  • ¿Cómo seleccionar y copiar texto en una vista que no está asociada a una actividad?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.