0

Ich habe eine Hauptaktivität, die eine LoginActivity zum ersten Mal starten. Hier geht alles gut. Wenn sich der Benutzer anmeldet, werden die Benutzerinformationen in geteilten Voreinstellungen gespeichert (um eine Anfrage an ApiRest zu stellen), so dass diese Funktion, die nur beim ersten Start startet, in Ordnung ist, weil ich beim nächsten Start der App in mainActivity bleibe. diese hauptaktivität hat 3 fragmente (im viewpager) die 3 fragments, wenn sie erstellt werden, machen eine anfrage um automatisch informationen von der api zu bekommen. Mein Problem ist in der Appbar von MainActivity Ich habe einen Menüpunkt, der den Benutzer abmeldet. Ich beabsichtige, die App auf loginActivity umzuleiten und den Stapel von Aktivitäten zu löschen und die geteilten Präferenzen zu löschen. aber meine Ergebnisse sind. 1. Ich werde auf die Login-Aktivität umgeleitet, aber wenn ich die App schließe und wieder öffne, respektiert sie nicht meine Methode in der Hauptaktivität (wenn sie zum ersten Mal auf LoginActivity umgeleitet werden muss) und erstellt die 3 Fragmente, die sofort starten um die Anfragen zu stellen, aber sie haben keine Parameter (sie sind null oder 0, da ich die gemeinsamen Einstellungen lösche), so dass die App abstürzt. Warum meine Methode zum ersten Mal LoginActivity geöffnet ist ??? Dank fortschrittlicherAndroid Logout-Methode und Clear Sharedreference funktioniert nicht

hier ist mein MainActivity mit der Methode, die nach dem Abmelden

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    final Variables variableGlobal = (Variables)getApplicationContext(); 
    SharedPreferences sharedPreferences= getSharedPreferences("firstTime",this.MODE_PRIVATE); 
    boolean firstTime = sharedPreferences.getBoolean("firstTime",true); 
    if(firstTime){ 
     SharedPreferences.Editor edit = sharedPreferences.edit(); 
     edit.putBoolean("firstTime", false); 
     edit.commit(); 
     startActivity(new Intent(MainActivity.this, LoginActivity.class)); 
     finish(); 

    }.... 

hier ist mein Abmeldecode ausfällt oder Weglassen:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 

    btnLogin= (Button)findViewById(R.id.btnLogin); 

    api= ApiUtils.getAPIService(); 
    btnLogin.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      login(); 
     } 
    }); 

} 
:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.logoutmain) { 
//Here i clear the sharedpref datos wich contains the user information 
     SharedPreferences pref = getSharedPreferences("datos",MODE_PRIVATE); 
     SharedPreferences.Editor editorpref = pref.edit(); 
     editorpref.clear(); 
     editorpref.commit(); 

//Here i clear the sharedPref that contains the value (boolean) to say the app if it is the first time or not 
     SharedPreferences pref2 = getSharedPreferences("firstTime",this.MODE_PRIVATE); 
     SharedPreferences.Editor editorpref2 = pref2.edit(); 
     editorpref2.putBoolean("firstTime",true); 
     editorpref2.commit(); 
     System.out.println("shared pref cleared"); 
     Intent intent=new Intent(getApplicationContext(),MainActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(intent); 
     finish(); 
     return true; 
    }... 

hier mein loginActivity ist

Denken Sie daran, wenn ich meine App ausführen, die Methode zu überprüfen, ob es die FirstTime ist, die es ausführt Start zu LoginActivity funktioniert ok, es wird nur die erste Zeit gestartet und das nächste Mal, dass ich immer in Main Activity geöffnet, aber wenn ich mich abmelde es mich umleiten, um den Stack und die sharedpref zu löschen, aber OMITT die Methode zu chek das ist Das erste Mal und hält mich in MainActivity und die App stürzt ab. Warum?? Dank in adavanced

+0

Nun, ich denke, Sie nicht für diese „firsttime“ Präferenz überprüfen sollten Sie‘ In der OnCreate-Methode festgelegt. Nachdem Sie es überprüft haben, legen Sie es auf "false" fest, sodass MainActivity gestartet wird, als ob der Benutzer sich bereits nach dem Schließen der App angemeldet hat. Sie könnten nach Ihrem "datos" Präsenz anstelle von "firstTime" – Daivid

+0

Ja Mann suchen, aber in der Logout-Methode lösche ich die sharedpreferences, und drehen Sie es auf TRUE, überprüfen Sie bitte meine Abmelde-Methode. – matQ

+0

yup, aber Sie setzen es nicht auf "true", wenn die Aktivität von selbst beendet wird, oder? der Kommentar von Nabis könnte es vielleicht ändern. – Daivid

Antwort

0

ich ein Problem in Ihrer Logik zu sehen, wäre die Quickfix den Code unten in Ihrem MainActivity zu verwenden:

boolean notFirstTime = sharedPreferences.getBoolean("firstTime" , false); 
if (! notFirstTime){ 
    SharedPreferences.Editor edit = ... 
+0

innerhalb der if, i shuold Speichern bearbeiten (firstTime, true) ?? – matQ

+0

Ja. Ändern Sie auch den Schlüssel auf "not_first_time" für bessere Lesbarkeit. –

+0

und die Abmelde-Methode, wie sollte ich ändern um mit den neuen Änderungen logisch zu sein? Sie empfehlen, zu löschen oder editieren als falsch? – matQ

Verwandte Themen