2017-06-23 6 views
-1

Ich habe eine Klasse A Diese Klasse erweitert oder implementiert keine anderen Klassen. Ich habe dann eine Klasse B, diese Klasse erweitert oder implementiert keine anderen Klassen.Kann SharedPreferences nicht initialisieren

ist meine Klasse B nur verwendet SharedPreferences zu verwalten:

private static SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext); 

Hier ist das Problem Methode in der Klasse B:

public static void setCurrentUsersEmail(String email){ 
    sharedPreferences.edit().putString("userEmail",email).commit(); 
} 

Jetzt Klasse A ein Datenbankmanager und muss die Benutzer speichern, E-Mail in SharedPreferences für die spätere Verwendung. Ich tue dies mit dem folgenden Code: `

MySharedPrefs.setCurrentUsersEmail(currentUsersEmail); 

Allerdings, wenn ich den Code in der Klasse A laufen versuche ich den Fehler:

java.lang.ExceptionInInitializerError at com.test.Android.MySharedPrefs.setCurrentUsersEmail(MySharedPrefs.java:0)

Ich bin wirklich verwirrt, warum dies geschieht, ich couldn Finden Sie keine Lösung online nach der Suche, ich verwende meine sharedPreferences-Klasse in anderen Aktivitäten völlig in Ordnung. Ist es ein Aktivitätsproblem?

Jede Hilfe wird sehr geschätzt.

+0

, wie Sie 'mContext' innen' getDefaultSharedPreferences passieren() 'Methode – Aryan

+0

So Ich rufe 'setCurrentUsersEmail (currentUsersEmail)' von einem RecyclerView-Adapter. Dies geht dann zu Klasse A, wo die Datenbank überprüft wird und dann SharedPreferences aufgerufen wird. Wenn die sharedPreferences ursprünglich erstellt werden, rufe ich eine Methode von MainActivity auf, um ihre Kontextdaten zu erhalten. Ich glaube nicht, dass der Kontext in diesem Fall gesendet wird, obwohl – memoryManagers

Antwort

0

Sie Singletons für Ihre Anforderung verwenden:

public class MyPrefs { 

    private static MyPrefs myPrefs; 
    private SharedPreferences sharedPreferences; 

    private MyPrefs(Context context){ 

     sharedPreferences=context.getSharedPreferences("MyPREFERENCES", Context.MODE_PRIVATE); 
    } 

    public static MyPrefs getInstance(Context context){ 

     if(myPrefs==null) 
      myPrefs=new MyPrefs(context); 
     return myPrefs; 
    } 

    public void setCurrentUsersEmail(String email){ 

     sharedPreferences.edit().putString("userEmail",email).commit(); 
    } 
} 

Sie können E-Mail auf diese Weise setzen:

MyPrefs.getInstance(context).setCurrentUsersEmail(currentUsersEmail); 

Sie benötigen Kontext für den Bezug von sharedPreferences in Ihrer Klasse zum ersten Mal passieren .

oder

Von Activity Anruf MyPrefs.getInstance(context) auf einmal

Dann können Sie ohne Kontext rufen

MyPrefs.getInstance().setCurrentUsersEmail(currentUsersEmail); 

getInstance() Methode:

public static MyPrefs getInstance(){ 

     if(myPrefs==null) throw new AssertionError("MyPrefs cannot be null"); 
     else 
     return myPrefs; 
} 
+1

Danke, dass dies funktioniert hat.Könnten Sie bitte erklären, warum es in diesem Fall keine SharedPreferencces von der MainActivity bekommt? – memoryManagers

+0

Zuerst sollte die statische Variable im statischen Block initialisiert werden und ** PreferenceManager ** -> Wird verwendet, um Präferenzhierarchien aus Aktivitäten oder XML zu erstellen und ** SharedPreferences ** -> Schnittstelle für den Zugriff auf Präferenzdaten, die von getSharedPreferences (String , int). Für einen bestimmten Satz von Präferenzen gibt es eine einzelne Instanz dieser Klasse, die alle Clients gemeinsam nutzen. – Aryan

+0

'PreferenceManager' wird normalerweise verwendet, wenn Sie eine PreferenceActivity erstellen oder einige Einstellungen aus einer .xml-Datei in Ihrer Anwendung mit Standardwerten laden möchten und die eigene Referenz auf SharedPreferences hat. – Aryan

0

Sie können dies tun, in jeder Tätigkeit sind, tragen Sie eine neue Methode erstellen müssen:

speichern:

SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit(); 
editor.putString("email", "[email protected]"); 
editor.commit(); 

wieder her:

SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE); 
String restoredText = prefs.getString("email", null); 

Sie kippe Anruf MyPrefs. aFunktionYouCreated() !!!