0

Alle notwendigen Importe werden hinzugefügt.SharedPreferences Code funktioniert nicht wie vorgesehen

public class MainActivity extends AppCompatActivity { 

SharedPreferences preferences; 
SharedPreferences.Editor editor; 
public int i; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    preferences = getSharedPreferences("MyPrefs", MODE_PRIVATE); 
    editor = preferences.edit(); 

Während ersten Mal booten die Meldung „Zum ersten Mal boot“ erscheint, sollte aber nicht während des nächsten Mal angezeigt, anstatt den Iterator i, die in sharedPreferences gespeichert wurde, erscheinen soll.

try{ 

     i = preferences.getInt("iterator", 0); 

     Toast.makeText(getApplicationContext(), i, Toast.LENGTH_SHORT).show(); 

    }catch(Exception e){ 
     Toast.makeText(MainActivity.this, "First time boot", Toast.LENGTH_SHORT).show(); 
    } 

    final TextView date = (TextView) (findViewById(R.id.textView)); 
    final Calendar c = Calendar.getInstance(); 
    date.setText(DateFormat.getDateFormat(this).format(c.getTime())); 

    final Button mainBtn = (Button) findViewById(R.id.mainBtn); 
    final Button exit = (Button) findViewById(R.id.exit); 

    mainBtn.setText("Clock In"); 

    mainBtn.setOnClickListener(new View.OnClickListener(){ 

     public void onClick(View v){ 
      if(mainBtn.getText() == "Clock In"){ 
       mainBtn.setText("Clock Out"); 
      }else{mainBtn.setText("Clock In");} 

      String s = new SimpleDateFormat("yyyy: MM: dd HH: mm: ss").format(Calendar.getInstance().getTime()); 

Meine Idee ist, dass eine Taste beim Klicken, würde ein Zeitstempel in die sharedPreferences-Datei gespeichert werden, die später zugegriffen werden können.

  editor.putString("Time "+ i, s); 

      i++; 

      editor.putInt("iterator", i); 

     } 
    }); 

Ich habe erst vor kurzem dieses, so dass, wenn Sie die Exit-Button klicken, wird alles, was gerettet werden würde in der sharedPreferences Datei gesetzt wurde. (Früher war die Zeile editor.commit() in der mainBtn onClickListener).

exit.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      editor.commit(); 
      finish(); 
     } 
    }); 
} 

Das Problem ist, dass die App beim Verlassen und zur Neubelebung es, wird die App nicht auf die gespeicherten Daten abrufen, die in der sharedPreferences Datei gespeichert werden sollten zu, sondern es sagt nur „Zum ersten Mal boote“ jedes Mal .. Ich bin extrem neu in der Programmierung und habe versucht, dieses Problem auf mehrere Arten zu überwinden, nur um das gleiche Problem zu erreichen. Hilfe!

Antwort

0

Nach meinem Wissen preferences.getInt ("Iterator", 0); wird keine Ausnahme auslösen, wenn "Iterator" nicht existiert. Es wird eine 0 zurückgeben. 0 ist der Standardwert. Ich würde den Code ändern, etwas mehr zu sein wie:

int iterator = preferences.getInt("iterator", -1); 
    if (iterator == -1) 
     Toast.makeText(this, "First time boot", Toast.LENGTH_SHORT).show(); 

Und wenn Sie an Ihrer Ausnahme aussehen, würde ich vermuten, dass das Problem von Ihrem Toast nach dem getInt tatsächlich ist („Iterator“, 0) nenne das ist Übergeben eines Int anstelle einer Zeichenfolge.

Auch würde ich nicht den Editor offen in Ihrer App halten. Ich würde normalerweise eine Funktion wie

void savePreference(String key, String value) { 
    SharedPreferences prefs = context.getSharedPreferences(PREFERENCES_NAME, 0); 
    SharedPreferences.Editor editor = prefs.edit(); 
    editor.putString(key, value); 
    editor.commit(); 
} 
schreiben