OnSaveInstanceState not working

The last link does not open when you return from another tab, and onPause () does not work .it shows a null pointer exception, and the application automatically closes by clicking on another tab except the first. code snippet

public class FragmentTab extends Fragment { protected WebView myWebView; @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_layout, container, false); WebView myWebView = (WebView) v.findViewById(R.id.webview); WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true); myWebView.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return false; } }); if(savedInstanceState != null) myWebView.restoreState(savedInstanceState); else myWebView.loadUrl("http://www.example.com"); return v; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); myWebView.saveState(outState); } } 

And here is MainActivity

 public class MainActivity extends FragmentActivity { private FragmentTabHost mTabHost; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost); mTabHost.setup(this, getSupportFragmentManager(), android.R.id.tabcontent); mTabHost.addTab( mTabHost.newTabSpec("tab1").setIndicator(null,ContextCompat.getDrawable(this,R.drawable.home)), FragmentTab.class, null); mTabHost.addTab( mTabHost.newTabSpec("tab2").setIndicator(null,ContextCompat.getDrawable(this,R.drawable.deals_offers)), FragmentTab.class, null); mTabHost.addTab( mTabHost.newTabSpec("tab3").setIndicator(null,ContextCompat.getDrawable(this,R.drawable.profile)), FragmentTab.class, null); mTabHost.addTab( mTabHost.newTabSpec("tab4").setIndicator(null, ContextCompat.getDrawable(this, R.drawable.menu)), FragmentTab.class, null); } } 
+8
android android-studio
source share
3 answers

Use this library: https://github.com/frankiesardo/icepick

remove protected webview

 @State WebView myWebView; // This will be automatically saved and restored 

Add the following line to your method. The Rest method will be processed.

In the OnCreate Method

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Icepick.restoreInstanceState(this, savedInstanceState); } 

In onSaveInstanceState

 @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Icepick.saveInstanceState(this, outState); } 
+3
source share

It appears that myWebView always has null code:

 public class FragmentTab extends Fragment { protected WebView myWebView; @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_layout, container, false); myWebView = (WebView) v.findViewById(R.id.webview); // instead of WebView myWebView = (WebView) v.findViewById(R.id.webview); WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true); myWebView.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return false; } }); if(savedInstanceState != null) myWebView.restoreState(savedInstanceState); else myWebView.loadUrl("http://www.example.com"); return v; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); myWebView.saveState(outState); } } 
+2
source share
 @Override public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); myWebView.saveState(savedInstanceState); } @Override public void onRestoreInstanceState(Bundle outState) { super.onRestoreInstanceState(outState); myWebView.restoreState(outState); } 

According to the source code.

  /** * Restores the state of this WebView from the given Bundle. This method is * intended for use in {@link android.app.Activity#onRestoreInstanceState} * and should be called to restore the state of this WebView. If * it is called after this WebView has had a chance to build state (load * pages, create a back/forward list, etc.) there may be undesirable * side-effects. Please note that this method no longer restores the * display data for this WebView. * * @param inState the incoming Bundle of state * @return the restored back/forward list or null if restoreState failed */ public WebBackForwardList restoreState(Bundle inState) { checkThread(); return mProvider.restoreState(inState); } 
+1
source share

All Articles