Android onSaveInstanceState不工作

Android onSaveInstanceState不工作,android,android-studio,Android,Android Studio,从其他选项卡返回时,最后一个链接未打开 onPause()也不工作。它显示空指针异常,当单击除第一个选项卡以外的其他选项卡时,应用程序自动关闭。 片段选项卡代码 public class FragmentTab extends Fragment { protected WebView myWebView; @Override public void onCreate(final Bundle savedInstanceState) { super.onCr

从其他选项卡返回时,最后一个链接未打开 onPause()也不工作。它显示空指针异常,当单击除第一个选项卡以外的其他选项卡时,应用程序自动关闭。 片段选项卡代码

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);
    }
}
以下是主要活动

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

代码中的myWebView看起来总是空的:

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);
}
} 
根据源代码

    /**
     * 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);
    }
使用此库:

从WebView中删除受保护的

@State 
WebView myWebView; // This will be automatically saved and restored
在活动方法中添加以下行,Rest将被处理

在OnCreate方法中

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

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

我总是使用setRetainInstance(true);用于在配置更改后避免重新创建的片段无需更改!使用setRetainInstance后(真);将myWebview和clientWebView定义为片段顶部的静态字段,并使用retain StateNot get-you。请详细说明!在ui配置(如rotating fragment)中的每次更改之后,请运行其Oncreateview方法,因此您应该将myWebview定义为片段上的静态字段,以避免像以前一样在每个TimeName上重新初始化它们!它不保存最后一个状态
@Override public void onSaveInstanceState(Bundle outState) 
   {
       super.onSaveInstanceState(outState);
       Icepick.saveInstanceState(this, outState);
   }