8
votes

OnsaveInstancestate ne fonctionne pas

Le dernier lien ne s'ouvre pas tout en revenant à partir d'un autre onglet Et aussi Onpause () ne fonctionne pas. Cela montre que Null Pointer Exception et APP se ferme automatiquement en cliquant sur un autre onglet, sauf la première. Code de l'onglet Fragment

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


7 commentaires

J'utilise toujours SeretatainStance (True); Pour les fragments pour éviter de recréer après des modifications de configuration


aucun changement ! Après avoir utilisé SetRetainStance (TRUE);


Définissez MyWebView et ClientwebView en tant que champs statiques en plus de fragment et utilisez Conserver l'état


Je ne peux pas te faire. S'il vous plaît donner dans les détails!


Après chaque modification des configurations d'interface utilisateur, comme le fragment de rotation, exécutez sa méthode OnCreateView, vous devez donc définir MyWebView comme champ statique sur votre fragment pour éviter de les réinitialiser à chaque fois


Faites aussi pour WebViewClient vous avez attribué. Désolé im sur le téléphone et c'est difficile à coder ici.


J'ai cherché ce genre de problème et j'ai trouvé ce devaHead.com/blog/2012/01/... peut être cela vous aidera.


3 Réponses :


2
votes

ressemble à mywebView toujours null dans votre 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);
}
} 


1 commentaires

pareil qu'avant ! Il ne sauve pas le dernier état



1
votes
    /**
     * 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);
    }

0 commentaires

3
votes

Utilisez cette bibliothèque: https://github.com/frankiesardo/icepick

Supprimer protégé de webview p> xxx pré>

ajoutez la ligne suivante dans votre méthode d'activité, le repos sera manipulé. p>

dans méthode oncreate p> xxx pré >

dans OnsaveInstancestate P>

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


0 commentaires