Salvando el estado de los fragmentos?
Tengo una clase de fragmento. Aquí está lo siguiente:
public class FragmentA extends Fragment { Button button; WebView myWebView; int mCurCheckPosition; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("curChoice", mCurCheckPosition); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (savedInstanceState != null) { // Restore last state for checked position. mCurCheckPosition = savedInstanceState.getInt("curChoice", 0); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved) { View mainView = (View) inflater.inflate(R.layout.frag_a, group, false); myWebView = (WebView) mainView.findViewById(R.id.webview); myWebView.setWebViewClient(new MyWebViewClient()); myWebView.getSettings().setPluginsEnabled(true); myWebView.getSettings().setBuiltInZoomControls(false); myWebView.getSettings().setSupportZoom(false); myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); myWebView.getSettings().setAllowFileAccess(true); myWebView.getSettings().setDomStorageEnabled(true); myWebView.loadUrl("http://www.bbc.co.uk"); return mainView; } public class MyWebViewClient extends WebViewClient { /* (non-Java doc) * @see android.webkit.WebViewClient#shouldOverrideUrlLoading(android.webkit.WebView, java.lang.String) */ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.endsWith(".mp4")) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse(url), "video/*"); view.getContext().startActivity(intent); return true; } else { return super.shouldOverrideUrlLoading(view, url); } } }
}
El problema es cuando me muevo hacia y desde otro fragmento, el estado del fragmento original (en qué página web estaba) se pierde.
¿Cómo puedo evitar esto? Quiero que el estado de la página web permanezca conmutando hacia y desde cada fragmento.
Gracias
Debe utilizar el método WebView.saveState (Bundle state) en su método onSaveInstanceState (Bundle outState) y restaurar el estado mediante WebView.restoreState (estado Bundle) en su método onActivityCreated (Bundle savedInstanceState)
@Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mWebView.saveState(outState); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mWebView.restoreState(savedInstanceState); }
También tenga en cuenta el Ciclo de Vida del Fragmento. Si no está seguro de dónde restaurar el estado ( onCreate, onCreateView, onActivityCreated ), eche un vistazo a la documentación de Fragment Lifecycle para determinar el lugar correcto. http://developer.android.com/guide/components/fragments.html
OnCreate ()
El sistema lo llama cuando crea el fragmento. Dentro de su implementación, debe inicializar los componentes esenciales del fragmento que desea retener cuando el fragmento se detiene o se detiene y, a continuación, se reanuda.
OnCreateView ()
El sistema llama a esto cuando es hora de que el fragmento dibuje su interfaz de usuario por primera vez. Para dibujar una interfaz de usuario para su fragmento, debe devolver una vista de este método que es la raíz del diseño del fragmento. Puede devolver null si el fragmento no proporciona una interfaz de usuario.
OnActivityCreated ()
Se llama cuando se ha creado la actividad del fragmento y se ha instanciado la jerarquía de este fragmento. Se puede utilizar para hacer la inicialización final una vez que estas piezas están en su lugar, como recuperar vistas o restaurar el estado. También es útil para fragmentos que utilizan setRetainInstance (boolean) para conservar su instancia, ya que esta devolución de llamada le dice al fragmento cuando está totalmente asociado con la nueva instancia de actividad. Esto se llama después onCreateView (LayoutInflater, ViewGroup, Bundle) y antes de onStart ().
Yo estaba teniendo el mismo problema con el contenido de webView en un fragmento. Lo que funcionó para mí fue ocultar el fragmento actual al cargar un nuevo en lugar de reemplazarlo. Esto hace que la vista permanezca en el fragmento anterior y no se destruya. Vea el código a continuación.
Protected void showTableFragment (Fragmento de fragmento, letBack booleano, tabla de activos) {
FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); if (table != null) tableSection = (SectionTable) table; Fragment lastFragment = fragmentManager.findFragmentByTag("first_frag" ); if ( lastFragment != null ) { transaction.hide( lastFragment ); } if ( fragment.isAdded() ) { transaction.show( fragment ); } else { transaction.add( R.id.fragment, fragment, "second_frag" ).setBreadCrumbShortTitle( "second_frag" ); } if ( allowBack ) { transaction.addToBackStack( "second_frag" ); } transaction.commit(); }