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.