2013-02-13 6 views
2

J'ai mon activité principale qui enregistre et charge des données à partir des SharedPreferences ... J'ai été capable de le faire jusqu'à maintenant.SharedPreferences renvoie une valeur nulle même si elle a une valeur par défaut

Voici mes méthodes onCreate, onPause et OnResume.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    setTitle(R.string.title_activity_main); 

    this.spinner = (Spinner) findViewById(R.id.geomObject); 
    this.sbWidth = (SeekBar) findViewById(R.id.widthSB); 
    this.sbDepth = (SeekBar) findViewById(R.id.depthSB); 
    this.sbHeight = (SeekBar) findViewById(R.id.heightSB); 
    this.widthProgress = (TextView) findViewById(R.id.widthDisplay); 
    this.depthProgress = (TextView) findViewById(R.id.depthDisplay); 
    this.heightProgress = (TextView) findViewById(R.id.heightDisplay); 

    ...more code... 
} 

protected void onResume() { 
    super.onResume(); 
    loadPrefs(); 
} 

protected void onPause() { 
    super.onPause(); 
    savePrefs(); 
} 

Et ce sont la méthode que je fais la plupart du travail, donc je peux garder les méthodes Onx propres:

private void savePrefs() { 
    this.width = this.sbWidth.getProgress(); 
    this.depth = this.sbDepth.getProgress(); 
    this.height = this.sbHeight.getProgress(); 
    this.forma = this.spinner.getSelectedItemPosition(); 

    getSharedPreferences("SEEKBARS", MODE_PRIVATE).edit().putInt("width", width).commit(); 
    getSharedPreferences("SEEKBARS", MODE_PRIVATE).edit().putInt("depth", depth).commit(); 
    getSharedPreferences("SEEKBARS", MODE_PRIVATE).edit().putInt("height", height).commit(); 
    getSharedPreferences("SEEKBARS", MODE_PRIVATE).edit().putInt("forma", forma).commit(); 
    getSharedPreferences("LOCKBARS", MODE_PRIVATE).edit().putBoolean("lockbars", menuLock.isChecked()).commit(); 
} 

private void loadPrefs() { 
    int savedSpinner = getSharedPreferences("SEEKBARS", MODE_PRIVATE).getInt("forma", SPINNER_DEFAULT); 
    int savedWidth = getSharedPreferences("SEEKBARS", MODE_PRIVATE).getInt("width", SEEKBAR_DEFAULT); 
    int savedDepth = getSharedPreferences("SEEKBARS", MODE_PRIVATE).getInt("depth", SEEKBAR_DEFAULT); 
    int savedHeight = getSharedPreferences("SEEKBARS", MODE_PRIVATE).getInt("height", SEEKBAR_DEFAULT); 

    boolean savedLockFlag = getSharedPreferences("LOCKBARS", MODE_PRIVATE).getBoolean("lockbars", false); 

    this.spinner.setSelection(savedSpinner); 
    this.sbWidth.setProgress(savedWidth); 
    this.sbDepth.setProgress(savedDepth); 
    this.sbHeight.setProgress(savedHeight); 
//This is the line raising the exception Display: 
     this.menuLock.setChecked(savedLockFlag); 


     this.widthProgress.setText(String.valueOf(savedWidth) + " " + getResources().getString(R.string.blocks)); 
     this.depthProgress.setText(String.valueOf(savedDepth) + " " + getResources().getString(R.string.blocks)); 
     this.heightProgress.setText(String.valueOf(savedHeight) + " " + getResources().getString(R.string.blocks)); 
    } 

Je ne vois pas où est l'erreur. J'ai recherché et je sais que je ne peux pas appeler getSharedPreferences sur onCreate, c'est pourquoi je le fais sur onResume. Qu'est-ce qui ne va pas?

Je joins aussi le logcat, juste au cas où:

FATAL EXCEPTION: main 
java.lang.RuntimeException: Unable to resume activity {es.nirvash.android.msg/es.nirvash.android.msg.MainActivity}: java.lang.NullPointerException 
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2567) 
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2595) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2109) 
    at android.app.ActivityThread.access$600(ActivityThread.java:132) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1157) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4575) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
    at es.nirvash.android.msg.MainActivity.loadPrefs(MainActivity.java:231) 
    at es.nirvash.android.msg.MainActivity.onResume(MainActivity.java:147) 
    at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1154) 
    at android.app.Activity.performResume(Activity.java:4539) 
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2557) 
    ... 12 more 
+2

"Je ne vois pas où est l'erreur J'ai recherché et je sais que je ne peux pas appeler getSharedPreferences sur onCreate, c'est pourquoi je le fais sur onResume" Où avez-vous entendu cela? C'est faux. – dymmeh

+0

Ici: http://stackoverflow.com/a/5991458/1569084 "getSharedPreferences() peut seulement être appelé AFTER onCreate() a été appelé sur une activité." – Deses

+0

utilisez le débogueur. pour voir ce qui est exactement nul. – njzk2

Répondre

4

Le problème est pas votre booléen, c'est la menuLock variable. boolean (type primitif) ne peut pas être null.

menuLock est déclaré et assurez-vous de posséder quelque chose. De cette façon, il ne sera pas nul quand vous l'utiliserez. Bien sûr, si c'est un View, attribuez-lui quelque chose à conserver dans onCreate(), après setContentView(), puisque c'est la mise en page de l'activité et la création garantie.

+1

Oh mon dieu, c'est tout. Bon sang! J'ai oublié que menuLock est supprimé ailleurs. – Deses

+1

De rien :-) Comme je l'ai dit dans ma réponse, les types primitifs (char, int, boolean, double, float) ne peuvent pas être 'null'. C'est réservé aux variables de référence, donc vérifiez toujours celles-ci. –

+0

Ouais, je sais. parfois j'ai oublié de démarrer les variables. – Deses

Questions connexes