2016-10-08 9 views
1

私は共有の設定に苦労していて、投稿とチュートリアルを見て、うまく動作しません。SharedPreferences.Editor NPE

私はついにこのコードをandroid.devからコピーしました。それは私にとってもうまくいきません。私が行った唯一の変更は、
です。1. ActivityではなくAppCompatActivityを拡張します。
2. printlnsと
を追加します。3. parmsをgetSharedPreferencesに追加します。

SharedPreferences.EditorのonPause()のNPEで失敗します。私はonStart()で例外を見つけません。

誰かが迷っていることを教えてもらえますか?前もって感謝します!

public class MainActivity extends AppCompatActivity { 
    static final int DAY_VIEW_MODE = 0; 
    static final int WEEK_VIEW_MODE = 1; 

    private SharedPreferences mPrefs; 
    private int mCurViewMode; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     System.out.println("onCreate() "); 
     SharedPreferences mPrefs = getSharedPreferences("MyPrefFile", 0); 
     mCurViewMode = mPrefs.getInt("view_mode", DAY_VIEW_MODE); 
    } 

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

     System.out.println("onPause() "); 
     SharedPreferences.Editor ed = mPrefs.edit(); 
     ed.putInt("view_mode", mCurViewMode); 
     ed.commit(); 
    } 
} 

ここでlogcatは、要求したエラーログですか?申し訳ありませんが、私はこれでかなり新しいです。 (UG ...これを共有するための良い方法は?あり)

java.lang.RuntimeException: Unable to pause activity {temperatureconverter.android.vogella.com.prefsfromandroiddev/temperatureconverter.android.vogella.com.prefsfromandroiddev.MainActivity}: java.lang.NullPointerException 
    at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2902) 
    at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2858) 
    at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2836) 
    at android.app.ActivityThread.access$900(ActivityThread.java:140) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1254) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4921) 
    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:1038) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
    at temperatureconverter.android.vogella.com.prefsfromandroiddev.MainActivity.onPause(MainActivity.java:38) 
    at android.app.Activity.performPause(Activity.java:5286) 
    at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1240) 
    at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2889) 
    at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2858)  
    at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2836)  
    at android.app.ActivityThread.access$900(ActivityThread.java:140)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1254)  
    at android.os.Handler.dispatchMessage(Handler.java:99)  
    at android.os.Looper.loop(Looper.java:137)  
    at android.app.ActivityThread.main(ActivityThread.java:4921)  
    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:1038)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)  
    at dalvik.system.NativeStart.main(Native Method) 
+1

を書いて、あなたのエラーログを投稿することができますか? –

答えて

2

それはあなたが外oncreateprivate SharedPreferences mPrefs;すなわち持っている1、その範囲と同じではありませんので、あなたのコードはmPrefsonCreate内部関数を作成し、初期化しますmPrefs;のごoncreateに限定されており、(nullになります)ので

は、現在のクラスにそれがグローバルにグローバル参照変数を使用しているので、あなたの oncreate関数の内部で再びそれを宣言しないために外に使用することはできませんそれはこのような関数の内部で使用することができます

public class MainActivity extends AppCompatActivity { 

    static final int DAY_VIEW_MODE = 0; 
    static final int WEEK_VIEW_MODE = 1; 

    private SharedPreferences mPrefs; 
    private int mCurViewMode; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     System.out.println("onCreate() "); 
     // you are creating an another mPrefs reference local to oncreate function 
     // which is different from the global one ,so remove this 
     // SharedPreferences mPrefs = getSharedPreferences("MyPrefFile", 0); 
     mPrefs = getSharedPreferences("MyPrefFile", 0); // use this 
     mCurViewMode = mPrefs.getInt("view_mode", DAY_VIEW_MODE); 
    } 

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

     System.out.println("onPause() "); 
     // you can do the same for editor to make it accessible to all functions 
     SharedPreferences.Editor ed = mPrefs.edit(); 
     ed.putInt("view_mode", mCurViewMode); 
     ed.commit(); 
    } 
} 
+1

ありがとうございます!私がそれを逃したとは信じられません。それはAndroid.devのようなものです。今私の実際のコードを取得するには、笑:)ありがとう! – Tmmccon

+0

@Tmmcconあなたの歓迎の男、それを維持して、幸せなコーディング:) –

-1

使用こののonCreate(バンドルsavedInstanceState)内部

mPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

代わりの

SharedPreferences mPrefs = getSharedPreferences("MyPrefFile", 0); 
+0

@PavneetSinghの回答は、何が起こっているのか、そしてどのように2つの行が異なるかを説明するので、より良いです。あなたの将来の答えにもそうすることを検討してください。ありがとう。 –