2016-03-28 35 views
8

他のタブ から戻るときに最後のリンクが開いていません。また、onPause()が動作していません.itはnullポインタの例外を示し、アプリケーションは自動的に他のタブをクリックします。 フラグメントタブコードonSaveInstanceStateが動作していません

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

、ここで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); 
    } 
} 
+0

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

OnCreateの方法において

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

。構成変更後にフラグメントが再作成されないようにするには –

+0

変更なし! setRetainInstanceを使用した後(true); –

+0

myWebviewとclientWebViewをフラグメントの上に静的フィールドとして定義し、保持状態を使用します –

答えて

2

ているあなたのコード内で常に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); 
} 
} 
+0

以前と同じ!最後の状態を保存しません –

1
@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
    myWebView.saveState(savedInstanceState);          
} 

@Override 
public void onRestoreInstanceState(Bundle outState) { 
    super.onRestoreInstanceState(outState); 
    myWebView.restoreState(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); 
    } 
3

使用このライブラリ:あなたの活動方法残りの部分でラインに続いて追加

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

WebViewの

から保護 https://github.com/frankiesardo/icepick

削除が処理されます。 onSaveInstanceState

いつもsetRetainInstance(true)を使用
関連する問題