2013-10-23 81 views
0

對不起,這是我第一次把問題在這個網站微調問題Sharedpreferences

我的功能:我設置兩個按鈕來恢復和保存功能Sharedpreferences在微調和EditText上的信息。

我第一次執行該程序。如果我點擊按鈕「恢復」來恢復微調器中的信息,程序將出現錯誤狀態。但是當我在EditText中恢復信息時,我還沒有遇到這個問題。

這是微調代碼

private Spinner.OnItemSelectedListener getfeet = new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> parent, View v, int position, 
      long id) { 
     // TODO Auto-generated method stub 
     feet_out = parent.getSelectedItemPosition() + 2; 
     select_f = feet.getSelectedItemPosition(); //save the position you choose 
     Toast.makeText(MainActivity.this, 
       "you chose " + parent.getSelectedItem().toString(), 
       Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> parent) { 
     // TODO Auto-generated method stub 
    } 
}; 
private Spinner.OnItemSelectedListener getinch = new OnItemSelectedListener() { 

    @Override 
    public void onItemSelected(AdapterView<?> parent, View v, int position, 
      long id) { 
     // TODO Auto-generated method stub 
     inch_out = parent.getSelectedItemPosition(); 
     select_i = inch.getSelectedItemPosition(); //save the position you choose 
     Toast.makeText(MainActivity.this, 
       "you chose " + parent.getSelectedItem().toString(), 
       Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> parent) { 
     // TODO Auto-generated method stub 

    } 

}; 

這是執行保存在Sharedpreferences的功能

private void save_() { 
    settings = getSharedPreferences("DATA", 0); 
    settings.edit().putInt("DATA_FEET", select_f) //store the position in DATA_FEET and DATA_INCH 
      .putInt("DATA_INCH", select_i) 
      .putString("DATA_WEIGHT", weight.getText().toString()).commit(); 
    Toast.makeText(MainActivity.this, R.string.done, Toast.LENGTH_SHORT) //save done 
      .show(); 
} 

這是執行在Sharedpreferences

恢復的函數的代碼的代碼
private void restore_() { 
    feet.setSelection(settings.getInt("DATA_FEET", select_f)); //restore the position 
    inch.setSelection(settings.getInt("DATA_INCH", select_i)); 
    weight.setText(settings.getString("DATA_WEIGHT", "EMPTY")); 

} 

我的問題是,我不能使用restor的功能e在第一次執行的程序中。有沒有解決方案來解決問題?因爲它在EditText中是正常的,但它在Spinner中不正常。謝謝:))

這是國家。 :))

10-23 23:14:11.677: D/TextLayoutCache(26370): Using debug level: 0 - Debug Enabled: 0 
    10-23 23:14:11.747: D/libEGL(26370): loaded /system/lib/egl/libGLES_android.so 
    10-23 23:14:11.797: D/libEGL(26370): loaded /system/lib/egl/libEGL_mali.so 
    10-23 23:14:11.827: D/libEGL(26370): loaded /system/lib/egl/libGLESv1_CM_mali.so 
    10-23 23:14:11.827: D/libEGL(26370): loaded /system/lib/egl/libGLESv2_mali.so 
    10-23 23:14:11.887: D/OpenGLRenderer(26370): Enabling debug mode 0 
    10-23 23:14:16.762: D/AndroidRuntime(26370): Shutting down VM 
    10-23 23:14:16.762: W/dalvikvm(26370): threadid=1: thread exiting with uncaught exception (group=0x40aaa210) 
    10-23 23:14:16.802: E/AndroidRuntime(26370): FATAL EXCEPTION: main 
    10-23 23:14:16.802: E/AndroidRuntime(26370): java.lang.NullPointerException 
    10-23 23:14:16.802: E/AndroidRuntime(26370): at com.example.bmi.MainActivity.restore_(MainActivity.java:44) 
    10-23 23:14:16.802: E/AndroidRuntime(26370): at com.example.bmi.MainActivity.access$1(MainActivity.java:43) 
    10-23 23:14:16.802: E/AndroidRuntime(26370): at com.example.bmi.MainActivity$2.onClick(MainActivity.java:99) 
    10-23 23:14:16.802: E/AndroidRuntime(26370): at android.view.View.performClick(View.java:3574) 
    10-23 23:14:16.802: E/AndroidRuntime(26370): at android.view.View$PerformClick.run(View.java:14293) 
    10-23 23:14:16.802: E/AndroidRuntime(26370): at android.os.Handler.handleCallback(Handler.java:605) 
    10-23 23:14:16.802: E/AndroidRuntime(26370): at android.os.Handler.dispatchMessage(Handler.java:92) 
    10-23 23:14:16.802: E/AndroidRuntime(26370): at android.os.Looper.loop(Looper.java:137) 
    10-23 23:14:16.802: E/AndroidRuntime(26370): at android.app.ActivityThread.main(ActivityThread.java:4448) 
    10-23 23:14:16.802: E/AndroidRuntime(26370): at java.lang.reflect.Method.invokeNative(Native Method) 
    10-23 23:14:16.802: E/AndroidRuntime(26370): at java.lang.reflect.Method.invoke(Method.java:511) 
    10-23 23:14:16.802: E/AndroidRuntime(26370): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823) 
    10-23 23:14:16.802: E/AndroidRuntime(26370): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590) 
    10-23 23:14:16.802: E/AndroidRuntime(26370): at dalvik.system.NativeStart.main(Native Method) 

這是調用restore_()

private OnClickListener reback_1 = new OnClickListener() { 
    public void onClick(View v) { 
     restore_(); 
    } 
}; 

我更換了select_fselect_i後進入0的方法,它出現了問題

10-24 00:01:30.957: D/TextLayoutCache(28836): Using debug level: 0 - Debug Enabled: 0 
10-24 00:01:31.017: D/libEGL(28836): loaded /system/lib/egl/libGLES_android.so 
10-24 00:01:31.037: D/libEGL(28836): loaded /system/lib/egl/libEGL_mali.so 
10-24 00:01:31.057: D/libEGL(28836): loaded /system/lib/egl/libGLESv1_CM_mali.so 
10-24 00:01:31.057: D/libEGL(28836): loaded /system/lib/egl/libGLESv2_mali.so 
10-24 00:01:31.087: D/OpenGLRenderer(28836): Enabling debug mode 0 
10-24 00:01:36.262: D/AndroidRuntime(28836): Shutting down VM 
10-24 00:01:36.262: W/dalvikvm(28836): threadid=1: thread exiting with uncaught exception (group=0x40aaa210) 
10-24 00:01:36.282: E/AndroidRuntime(28836): FATAL EXCEPTION: main 
10-24 00:01:36.282: E/AndroidRuntime(28836): java.lang.NullPointerException 
10-24 00:01:36.282: E/AndroidRuntime(28836): at com.example.bmi.MainActivity.restore_(MainActivity.java:44) 
10-24 00:01:36.282: E/AndroidRuntime(28836): at com.example.bmi.MainActivity.access$1(MainActivity.java:43) 
10-24 00:01:36.282: E/AndroidRuntime(28836): at com.example.bmi.MainActivity$2.onClick(MainActivity.java:99) 
10-24 00:01:36.282: E/AndroidRuntime(28836): at android.view.View.performClick(View.java:3574) 
10-24 00:01:36.282: E/AndroidRuntime(28836): at android.view.View$PerformClick.run(View.java:14293) 
10-24 00:01:36.282: E/AndroidRuntime(28836): at android.os.Handler.handleCallback(Handler.java:605) 
10-24 00:01:36.282: E/AndroidRuntime(28836): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-24 00:01:36.282: E/AndroidRuntime(28836): at android.os.Looper.loop(Looper.java:137) 
10-24 00:01:36.282: E/AndroidRuntime(28836): at android.app.ActivityThread.main(ActivityThread.java:4448) 
10-24 00:01:36.282: E/AndroidRuntime(28836): at java.lang.reflect.Method.invokeNative(Native Method) 
10-24 00:01:36.282: E/AndroidRuntime(28836): at java.lang.reflect.Method.invoke(Method.java:511) 
10-24 00:01:36.282: E/AndroidRuntime(28836): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823) 
10-24 00:01:36.282: E/AndroidRuntime(28836): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590) 
10-24 00:01:36.282: E/AndroidRuntime(28836): at dalvik.system.NativeStart.main(Native Method) 
10-24 00:01:37.803: I/Process(28836): Sending signal. PID: 28836 SIG: 9 
+0

你能解釋一下你想要發生什麼,問題更清楚些嗎?我對這個問題很困惑...... – codeMagic

+0

我需要函數「restore」可以在程序中第一次正常執行,或者Sharedpreferences的堆棧是NULL。但是,一旦我點擊按鈕「恢復」,它總是出現錯誤。對不起,我的小英文:)) –

+0

如果它的崩潰postcat從崩潰 – codeMagic

回答

0

你是使用SharedPrefs錯誤。

feet.setSelection(settings.getInt("DATA_FEET", select_f)); 

當您嘗試從sharedPref中獲取整數值時,您將返回null!因爲我認爲你誤解了它是如何完成的:

settings.getInt("myKey", defaultValue); 

返回關鍵字「myKey」的值。如果「myKey」沒有設置值,則返回「defaultValue」。在你的情況下,它返回「select_f」的當前值。正如它看起來,當您第一次運行您的應用程序時,select_f的值爲null。

因此,您必須決定在檢索sharedPrefs之前是否初始化「select_f」,或者在此輸入另一個defaultValue。

+0

我已經更新了這個問題。對不起,我只是一個初學者。 –