Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Recarga de WebView cuando Fragmento en ViewPager se retiene desde BackStack

Aquí hay un código para un Fragment básico que contiene un WebView .
WebFragment.java

 public class WebFragment extends Fragment { String TAG = "WebFragment"; private WebView webView; private String currentUrl = "http://www.google.com"; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.webview_layout, null); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); webView = (WebView) getView().findViewById(R.id.helloWebview); initWebView(); webView.loadUrl(currentUrl); } @SuppressLint("SetJavaScriptEnabled") private void initWebView() { webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new JavaScriptInterface(), "HTMLOUT"); webView.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { Log.e(TAG, "Loding..."); super.onPageStarted(view, url, favicon); } }); } class JavaScriptInterface { public void showHTML(String html) { } } } 

Tengo 2 más fragmentos básicos también (que no tiene WebView ). Luego pongo todos estos 3 Fragments en ViewPager ( WebFragment , Fragment1 y Fragment2 respectivamente) usando FragmentAdapter . Y agregué android:configChanges="orientation|screenSize" en AndroidManifest.xml (So WebView no realod en el cambio de configuración).
Ahora mi problema es, mientras ejecuta la aplicación cambié la primera página (WebFragmet) de ViewPager a la 2 ª página ( Fragment1 ) y de nuevo volví a la primera página. Así que no hay problema WebFragment es como es.

Ahora otra vez cambié el ViewPager como este WebFragment -> Fragment1 -> Fragment2 y volví a la 1ra página invirtiendo la dirección de la acción antedicha. Pero en ese momento vi el WebView en WebFragment está recargando.

Y un problema más, siempre que el WebView comenzó a cargar puedo ver 2 entrada de registro como.

 WebFragment Loading... WebFragment Loading... 

Así que mi pregunta es:
1) ¿Cómo puedo evitar la recarga WebView cuando el WebFragment se retiene de BackStack ?
2) ¿Por qué aquí cargar WebView dos veces?

Sólo vea esta pregunta y ayúdame ( Prevenir las recargas de WebView en FragmentPagerAdapter? ).

  • Android Fragmento Back Stack
  • Guardar y restaurar el estado de la interfaz de usuario del fragmento cuando se empuja y sale del backstack
  • Cómo persistir los datos de fragmentos después de las transacciones backstack?
  • Problemas con Android Fragment pila trasera
  • Modificación de la pila trasera en Android
  • Cómo Reverse Fragment animaciones en BackStack?
  • ¿Cómo puedo mantener el estado de fragmento cuando se agrega a la pila trasera?
  • Android: abrir la actividad sin guardar en la pila
  • 3 Solutions collect form web for “Recarga de WebView cuando Fragmento en ViewPager se retiene desde BackStack”

    En su actividad principal donde ha definido viewpager

    Después de la declaración de viewpager como esta línea: ViewPager viewpager = (ViewPager) findViewById(R.id.pager);

    Añadir esta línea:

     viewpager.setOffscreenPageLimit(2); 

    Esto evitará que tu fragmento se recupere hasta que se deslicen dos pantallas, de modo que cuando regreses de la 3ª página a la 1ª página en el viewpager, tu webview no volverá a cargarse.

    Este es un caso clásico de ser víctima de la solución fácil de reemplazar el android:configChanges para resolver un problema. Desafortunadamente hay varias razones por las que se producirá un cambio de configuración. Así que simplemente la captura de un cambio de tamaño de la pantalla se pierda muchos de ellos … como usted ha descubierto.

    En primer lugar, quite completamente android:configChanges . A continuación, añada lo siguiente al fragmento WebView .

     protected void onSaveInstanceState(Bundle outState) { webView.saveState(outState); } 

    Ajuste el método onActivityCreated su fragmento WebView para incluir lo siguiente:

     public void onActivityCreated(Bundle savedInstanceState) { webView = (WebView) getView().findViewById(R.id.helloWebview); initWebView(); if (savedInstanceState != null) webView.restoreState(savedInstanceState); else webView.loadUrl(currentUrl); 

    }

    Eso debería hacer que vayas en la dirección correcta. Tenga en cuenta que llamar a saveState () de un WebView no guardará los datos de visualización. Por ejemplo, las etiquetas de entrada no perserven la entrada del usuario. Tendrá que analizar a través de la página web manualmente para persistir esos datos. Dependiendo de lo que usted está utilizando el WebView para, esto será un dolor importante.

    Bueno, para fragmentos de uso como este.

     A extends Fragment { static WebView w; View v; private Handler handler = new Handler(){ @Override public void handleMessage(Message message) { switch (message.what) { case 1:{ webViewGoBack(); }break; } } private void webViewGoBack() { w.goBack(); // TODO Auto-generated method stub } }; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ v = inflater.inflate(R.layout.webs, container, false); w=(WebView)v.findViewById(R.id.webView1); //w.loadUrl(""); } w.setOnKeyListener(new OnKeyListener(){ @Override public boolean onKey(View v, int keyCode, KeyEvent event) { // TODO Auto-generated method stub if((keyCode==KeyEvent.KEYCODE_BACK)&& w.canGoBack()) { handler.sendEmptyMessage(1); return true; } return false; } }); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.