2017-05-25 2 views
-2

Ich habe stundenlang auf der Tastatur den Kopf geschlagen. Ich möchte eine inkrementierte Ganzzahl für eine separate Statistikaktivität in meiner App speichern. Ich versuche, die gemeinsamen Einstellungen zu verwenden, um dies zu erreichen. Bei meinem letzten Versuch, der am weitesten fortgeschritten ist, löst das Programm eine Ausnahme aus.Null Objektreferenz mit SharedPreferences

Mein Code:

public class LootChest extends AppCompatActivity { 
    public static final String prefName = "prefsFile"; 
    SharedPreferences settings = getApplicationContext().getSharedPreferences(prefName, 0); //line 25 
    int rollCountS = settings.getInt("Roll Count", 0); 
    int rollCount = 0; //to be incremented 

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

    public void openChest(View v) { 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putInt("Roll Count", rollCount); 
     rollCount = rollCountS + 1; 

Die Ausnahme:

Caused by: java.lang.NullPointerException: 
Attempt to invoke virtual method 
'android.content.SharedPreferences android.content.Context 
.getSharedPreferences(java.lang.String, int)' 
on a null object reference at android.content.ContextWrapper 
.getSharedPreferences(ContextWrapper.java:171) 
at net.zingrook.mobiloot.LootChest.<init>(LootChest.java:25) 

Ich habe Dutzende von Threads lesen diese auf die Implementierung und schaute auf die Android-Dokumentation und ich bin aus Ideen. Danke für jede Hilfe.

+0

Ich bin kein Android-Programmierer, aber wenn das Problem der Context-Wrapper ist in der Klasse Instanziierung null ist, ist es möglich die Einstellungen sollten nach dem 'onCreate' aufgerufen werden? – KevinO

Antwort

1

Ändern Sie einfach diesen Code auf diese Weise.

public class LootChest extends AppCompatActivity { 
    public static final String prefName = "prefsFile"; 
    SharedPreferences settings; //line 25 
    int rollCountS; 
    int rollCount = 0; //to be incremented 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_loot_chest); 
     settings = getApplicationContext().getSharedPreferences(prefName, 0); 
     rollCountS = settings.getInt("Roll Count", 0); 
    } 
4

Sie initialisieren das sharedPreference-Objekt, bevor der Aktivitätslebenszyklus beginnen kann.

die Initialisierung in onCreate

public static final String prefName = "prefsFile"; 
    SharedPreferences settings; //line 25 
    int rollCountS; 
    int rollCount = 0; 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_loot_chest); 
     settings = getApplicationContext().getSharedPreferences(prefName, 0); 
    } 
0

meiner Sicht bewegen

public class LootChest extends AppCompatActivity { 
public static final String prefName = "prefsFile"; 
SharedPreferences settings; 
SharedPreferences.Editor editor; 
int rollCountS; 
int rollCount = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_loot_chest); 
    settings=getApplicationContext().getSharedPreferences(prefName, 0); 
    editor = settings.edit(); 
    rollCountS= settings.getInt("Roll Count", 0); 
} 

public void openChest(View v) { 
    editor.putInt("Roll Count", rollCount); 
    rollCount = rollCountS + 1; 
Verwandte Themen