2016-03-28 6 views
8

अंतिम लिंक अन्य टैब से लौटने के दौरान खुलता नहीं है और पॉज़() भी काम नहीं कर रहा है। यह शून्य सूचक अपवाद दिखाता है और ऐप स्वचालित रूप से बंद हो जाता है जबकि पहले टैब को छोड़कर अन्य टैब पर क्लिक किया जाता है। टुकड़ा टैब कोड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 myWebView तरह

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

में मैं हमेशा setRetainInstance (सही) का उपयोग करें; विन्यास परिवर्तन के बाद पुनरुत्थान से बचने के लिए टुकड़े के लिए –

+0

कोई बदलाव नहीं! setRetainInstance (सत्य) का उपयोग करने के बाद; –

+0

खंड के शीर्ष पर स्थिर फ़ील्ड के रूप में myWebview और clientWebView को परिभाषित करें और –

उत्तर

2

देखो हमेशा अपने कोड में अशक्त हैं:

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

उपयोग इस लाइब्रेरी: https://github.com/frankiesardo/icepick

निकालें WebView

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

जोड़ें संरक्षित आपकी गतिविधि विधि बाकी हिस्सों में लाइन के बाद नियंत्रित किया जाएगा।

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); 
    } 
संबंधित मुद्दे