2017-03-18 3 views
1

Diese Aktivität stürzt ab, wenn ich es zum Debuggen in mein Handy stecke, habe ich nur die Teile zum Speichern von Variablen hinzugefügt. Habe ich etwas falsch gemacht?Androbe Shared Preferences stürzt ab

Es ist eine Aktivität und soll die aktuellen Variablen erhalten, wenn sie sie früher setzen, und der Benutzer kann sie auch einstellen.

package com.software.roux.diabcalc; 

import android.content.Intent; 
import android.content.SharedPreferences; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.EditText; 

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.PrintWriter; 

import static com.software.roux.diabcalc.R.id.bolus; 

public class Settings extends AppCompatActivity { 

    SharedPreferences mPrefs = getSharedPreferences("label", 0); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_settings); 
     setTitle("Insulin Calculator by Ben Roux"); 

     String bolusString = mPrefs.getString("bolus", "0"); 
     String corrString = mPrefs.getString("correction", "0"); 
     String lowString = mPrefs.getString("low", "0"); 
     String highString = mPrefs.getString("high", "0"); 

     EditText b1 = (EditText)findViewById(R.id.bolus); 
     b1.setText(bolusString); 

     EditText b2 = (EditText)findViewById(R.id.correction); 
     b2.setText(corrString); 

     EditText b3 = (EditText)findViewById(R.id.targetlow); 
     b3.setText(lowString); 

     EditText b4 = (EditText)findViewById(R.id.targethigh); 
     b4.setText(highString); 
    } 

    public void switchclick(View a) { 
     if (a.getId() == R.id.backbutton) { 
      Intent myIntent = new Intent(Settings.this, MainActivity.class); 
      Settings.this.startActivity(myIntent); 
     } 
    } 

    public void setclick(View b) { 
     if (b.getId() == R.id.setter) { 

      EditText b1 = (EditText)findViewById(R.id.bolus); 
      String bolussave = ""+b1; 
      SharedPreferences.Editor mEditor1 = mPrefs.edit(); 
      mEditor1.putString("bolus", bolussave).commit(); 

      EditText b2 = (EditText)findViewById(R.id.correction); 
      String corrsave = ""+b2; 
      SharedPreferences.Editor mEditor2 = mPrefs.edit(); 
      mEditor2.putString("correction", corrsave).commit(); 


      EditText b3 = (EditText)findViewById(R.id.targetlow); 
      String lowsave = ""+b3; 
      SharedPreferences.Editor mEditor3 = mPrefs.edit(); 
      mEditor3.putString("low", lowsave).commit(); 


      EditText b4 = (EditText)findViewById(R.id.targethigh); 
      String highsave = ""+b4; 
      SharedPreferences.Editor mEditor4 = mPrefs.edit(); 
      mEditor4.putString("high", highsave).commit(); 


     } 
    } 
} 

AKTUALISIERUNG Crashlog:

03-18 15: 29: 59,477 7801-7801/com.software.roux.diabcalc E/Android Runtime: fatal EXCEPTION: main Prozess: com. software.roux.diabcalc, PID: 7801 java.lang.RuntimeException: Aktivität kann nicht instanziiert werden ComponentInfo {com.software.roux.diabcalc/com.software.roux.diabcalc.Settings}: java.lang.NullPointerException: Versuch Aufruf der virtuellen Methode 'android.content. SharedPreferences android.content.Context.getSharedPreferences (java.lang.String, int)‘ auf einer Null-Objektreferenz bei android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3094) bei android.app.ActivityThread .handleLaunchActivity (ActivityThread.java:3350) bei android.app.ActivityThread.access 1100 $ (ActivityThread.java:222) bei android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1795) bei android.os .Handler.dispatchMessage (Handler.java:102) bei android.os.Looper.loop (Looper.java:158) bei android.app.ActivityThread.main (ActivityThread.java:7229) bei java.lang.reflect.Method.invoke (native Methode) um com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit. java: 1230) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1120) verursacht durch: java.lang.NullPointerException: Versuch virtuelle Methode ‚android.content.SharedPreferences aufzurufen android.content .Context.getSharedPreferences (java.lang.String, int) ' für einen Nullobjektverweis um android.content.ContextWrapper.getSharedPreferences (ContextWrapper.java:185) bei com.software.roux.diabcalc.Settings (Settings.java:21) bei java.lang.Class.newInstance (native Methode) bei android.app.Instrumentation.newActivity (Instrumentation.java:1095) bei android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3084) bei android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3350) bei android.app.ActivityThread.access 1100 $ (ActivityThread.java:222) unter android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1795) bei android.os.Han dler.dispatchMessage (Handler.java:102) bei android.os.Looper.loop (Looper.java:158) bei android.app.ActivityThread.main (ActivityThread.java:7229) bei java.lang.reflect. Method.invoke (Native Methode) um com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1230) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1120)

+0

Können Sie bitte das Crashprotokoll bereitstellen? –

+0

Wo wären sie? Android-Studio verwenden. –

+0

Wenn Sie Ihr Programm auf einem angeschlossenen Gerät oder Emulator ausführen, können Sie das Protokoll im Logcat sehen. Suchen Sie in Ihrer Android Studio-Leiste nach "Android Monitor". –

Antwort

1

Anzeige initialisieren Nur SharedPreferences mPrefs später. In onCreate Methode.

Die context wird erst nach onCreate Methode initialisiert. Also, dies funktioniert hat:

SharedPreferences mPrefs; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_settings); 
     setTitle("Insulin Calculator by Ben Roux"); 
mPrefs= getSharedPreferences("label", 0); 

Als die andere Frage, in Ihrem aktuellen Code, der Sie speichert nur Adresse von EditText Variable im Speicher. Um den Text zu retrive, verwenden Sie diese:

String bolussave = ""+b1.getText().toString();

+0

Ich habe das behoben und jetzt habe ich ein separates Problem. Anfangs sind die Variablen 0, aber nachdem ich sie eingestellt habe, schließe ich die App und öffne sie erneut, sie zeigen "android.support.v7.widget ... app: id/targetthigh" an, das ist die Referenz-ID und nicht der Wert ? Und wie würde ich zum tatsächlichen Wert konvertieren? –

+0

@BenRoux, aktualisiert – Vyacheslav

0

Versuchen Sie mPrefs in Ihrem OnCreate Methode instanziieren.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_settings); 
    setTitle("Insulin Calculator by Ben Roux"); 

    String bolusString = mPrefs.getString("bolus", "0"); 
    mPrefs = getSharedPreferences("label", 0); 
    ... 
    ...