varios tutorial pasar parametros llamar life iniciar fragments example entre diferencia activity android android-fragments android-webview android-viewpager back-stack

tutorial - pasar parametros entre fragments android



Recarga de WebView cuando el Fragmento en ViewPager se retiene de BackStack (3)

Bueno para usar fragmentos 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; } });

Aquí hay un código para un Fragment básico que contiene una vista 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) { } } }

También tengo 2 fragmentos más básicos (que no tienen WebView ). Luego puse todos estos 3 Fragments en ViewPager ( WebFragment , Fragment1 y Fragment2 respectivamente) usando FragmentAdapter . Y agregué android:configChanges="orientation|screenSize" en AndroidManifest.xml (por lo que WebView no se aplicará al cambio de configuración).
Ahora mi problema es que, al ejecutar la aplicación, cambié la primera página (WebFragmet) de ViewPager a la segunda página ( Fragment1 ) y de nuevo volví a la primera página. Así que no hay problema, WebFragment es como es.

Ahora, de nuevo, cambié el ViewPager como este WebFragment -> Fragment1 -> Fragment2 y volví a la primera página invirtiendo la dirección de la acción anterior. Pero en ese momento vi que la WebView en WebFragment está recargando.

Y un problema más, cada vez que se inicia la carga de WebView puedo ver 2 entradas de registro como.

WebFragment Loading... WebFragment Loading...

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

Solo vea esta pregunta y ayúdeme (¿ Impedir que las recargas de WebView en FragmentPagerAdapter? ).


En tu actividad principal donde has 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 su fragmento se vuelva a crear hasta dos pantallas, de modo que cuando regrese de la 3ª página a la 1ª página en viewpager, su vista web no se volverá a cargar.


Este es un caso clásico de ser víctima de la fácil corrección de parches de anular android:configChanges para resolver un problema. Desafortunadamente, hay varias razones por las que se producirá un cambio de configuración. Así que simplemente captar un cambio en el tamaño de la pantalla perderá muchos de ellos ... como ha descubierto.

En primer lugar, eliminar completamente android:configChanges . Luego agregue lo siguiente a su fragmento de WebView .

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

Ajuste el método onActivityCreated su fragmento de onActivityCreated 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 conservarán la entrada del usuario. Deberá analizar manualmente la página web para conservar esos datos. Dependiendo de para qué esté usando el WebView, esto será un gran dolor.