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:
- cómo establecer el color de texto de webview en android
- ¿El error de AdView causó que todas las vistas de la Web dejen de cargarse cuando cambia la orientación y se están ejecutando múltiples subprocesos?
- Envoltura de HTML en una aplicación para Android
- Emular archivos de hosts en Android no enraizado
- Android cómo enviar int y doble como namevaluepair como http post
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.
- ¿Cómo inspeccionar el elemento en el teléfono Android utilizando el navegador de UC?
- Giro a la izquierda / derecha de Android en la actividad de WebView (haciendo clic en vínculos y desplazamiento vertical)
- Notificación de empuje en Web móvil
- Android 4.1 webview javascript no funciona.
- Vista web de Android: evita que los gestos táctiles se pasen a la vista principal de los padres
- En la vista Web de Android, ¿puedo modificar el DOM de una página web?
- ¿Puedo ejecutar JavaScript sin un WebView, o un WebView puede ejecutarse sin un contexto de actividad, como en un servicio?
- Descargar archivo dentro de WebView
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"
- Usar código Ada en Android
- Consecuencias del cambio de nombre de Android Market / Google Play para los desarrolladores