Anirban Bhui
Anirban Bhui

Reputation: 6493

onSaveInstanceState is not working

The last link is not opening while returning from other tab and also onPause() is not working .it shows null pointer exception and app closes automatically whilie clicking other tab except first one . fragment tab 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);
        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 are the 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);
    }
}

Upvotes: 8

Views: 1885

Answers (3)

Praveen
Praveen

Reputation: 408

Use This Library : https://github.com/frankiesardo/icepick

remove protected from WebView

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

Add Following Line In Your Activity Method Rest Will Be Handled.

In 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);
   }

Upvotes: 2

tiny sunlight
tiny sunlight

Reputation: 6251

@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 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);
    }

Upvotes: 1

Khang .NT
Khang .NT

Reputation: 1579

Look like myWebView always null in your 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);
}
} 

Upvotes: 2

Related Questions