2011-12-15 51 views
1

爲什麼我需要爲其使用的每種方法(如onClick for buttons)創建一個新的SharedPreferences對象? 爲什麼我不能在類的開頭創建一次,然後像任何第二個示例中那樣從任何方法中使用它來添加和刪除它? 如果我像第二個示例中那樣將兩行移動到方法之外,那麼當活動應該開始時(當我從另一個活動轉到該活動時),它會直接崩潰並顯示消息「應用程序意外停止 - 強制關閉」。在方法崩潰之外創建SharedPreferences對象應用程序

例1 - 這個工程

public class FormEdit extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    ... 
     Button btnSave = (Button) findViewById(R.id.btnSave); 
     btnSave.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       SharedPreferences myPref = getSharedPreferences("PrefData", MODE_PRIVATE); 
       SharedPreferences.Editor myPrefEditor = myPref.edit(); 
       ... 
       myPrefEditor.putString("Key", value); 
       myPrefEditor.commit(); 
       ... 

例2 - 不工作

public class FormEdit extends Activity { 

    SharedPreferences myPref = getSharedPreferences("PrefData", MODE_PRIVATE); 
    SharedPreferences.Editor myPrefEditor = myPref.edit(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    ... 
     Button btnSave = (Button) findViewById(R.id.btnSave); 
     btnSave.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       ... 
       myPrefEditor.putString("Key", value); 
       myPrefEditor.commit(); 

=更新= 日誌貓:

E/AndroidRuntime(620): 
Uncaught handler: thread main exiting due to uncaught exception 
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.devtest/com.devtest.FormEdit}: java.lang.NullPointerException 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2417) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
    at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:4363) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
    at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:146) 
    at com.devcom.android.devtest.IceEdit.<init>(IceEdit.java:20) 
    at java.lang.Class.newInstanceImpl(Native Method) 
    at java.lang.Class.newInstance(Class.java:1479) 
    at android.app.Instrumentation.newActivity(Instrumentation.java:1021) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2409) 
    ... 11 more 
+0

您能否將錯誤粘貼到logcat中? 「應用程序崩潰」不是一個很好的問題描述:) – WarrenFaith 2011-12-15 00:22:21

+0

對不起,容易把事情理所當然會發生什麼。澄清了這個問題,所以希望不會更清楚。 – 2011-12-15 01:14:20

回答

1

大概是因爲一旦你點擊一次,你有一個已經提交的編輯。你可以中途去這樣做:

public class FormEdit extends Activity { 

    SharedPreferences myPref = getSharedPreferences("PrefData", MODE_PRIVATE); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    ... 
     Button btnSave = (Button) findViewById(R.id.btnSave); 
     btnSave.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       SharedPreferences.Editor myPrefEditor = myPref.edit(); 
       myPrefEditor.putString("Key", value); 
       myPrefEditor.commit(); 

更新:

啊,我不認爲它不夠緊密。此行:

SharedPreferences myPref = getSharedPreferences("PrefData", MODE_PRIVATE); 

在創建活動之前會出現問題。把它移到你的onCreate應該會有所幫助。當你有一個崩潰的問題時,習慣張貼你的堆棧跟蹤,這將有助於更快地縮小問題的範圍。

public class FormEdit extends Activity { 

    SharedPreferences myPref; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    ... 

     myPref = getSharedPreferences("PrefData", MODE_PRIVATE); 
     Button btnSave = (Button) findViewById(R.id.btnSave); 
     btnSave.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       SharedPreferences.Editor myPrefEditor = myPref.edit(); 
       myPrefEditor.putString("Key", value); 
       myPrefEditor.commit(); 
8

在「getSharedPreferences()」方法需要自己的活動,這是您的super.onCreate()之後創建的上下文。因此,如果您在onCreate之前實例化對象SharedPreferences,它會崩潰。

在您的活動的onCreate中執行並隨後使用它。

相關問題