2011-12-21 7 views
0

私はAndroid用のプログラミングを始めています。SharedPreferencesの読み書きコード(各アクティビティ)を別のクラスに分けようとするまでは、 ConfigManager。 I /書き込みの好みを読み取るために、このクラスをインスタンス化しようとすると、私はエラーとアプリケーションが終了を受け、今独立したクラスのAndroidとSharedPreferences

package com.application.testing; 

import android.app.Activity; 
import android.content.Context; 
import android.content.SharedPreferences; 

public class ConfigManager extends Activity { 

    public boolean boolPref; 
    public String stringPref; 

    private SharedPreferences prefs; 

    public ConfigManager() { 
     prefs = getSharedPreferences(
       getResources().getString(R.string.preferences), 
       Context.MODE_PRIVATE); 
     loadCfg(); 
    } 

    public void saveCfg() { 

     SharedPreferences.Editor editor = prefs.edit(); 

     editor.putBoolean("boolPreference", boolPref); 
     editor.putString("stringPreference", stringPref); 

     editor.commit(); 

    } 

    public void loadCfg() { 

     this.boolPref = prefs.getBoolean("boolPreference", false); 
     this.stringPref = prefs.getString("stringPreference", ""); 

    } 

} 

は、ここに私のCONFIGMANAGERクラスです。

スプラッシュスクリーンは、ユーザーが表示しないことを選択した場合、プリファレンスに保持し、アプリケーションの開始時にtrueまたはfalseの場合はスプラッシュスクリーンを表示するか、次のアクティビティに移動します。

これは、スプラッシュスクリーンクラスのコードのようになります。

package com.application.testing; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 

public class SplashScreen extends Activity { 

    public ConfigManager cfg; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     cfg = new ConfigManager(); 

     if (!(cfg.boolPref)) { 
      Intent i = new Intent("com.application.testing.NEXTACTIVITY"); 
      startActivity(i); 
     } else { 

      setContentView(R.layout.splash); 

      Thread timer = new Thread() { 
       public void run() { 

        try { 
         sleep(3000); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } finally { 
         Intent i = new Intent("com.application.testing.NEXTACTIVITY"); 
         startActivity(i); 
        } 

       } 
      }; 

      timer.start(); 
     } 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     cfg.saveCfg(); // not neccesary, no preference changes during splashscreen execution 
     finish(); 
    } 

} 

最後に、これはLogcat出力です:私のエラーがどこにある

12-21 23:46:48.294: D/AndroidRuntime(1381): Shutting down VM 
12-21 23:46:48.344: W/dalvikvm(1381): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
12-21 23:46:48.375: E/AndroidRuntime(1381): FATAL EXCEPTION: main 
12-21 23:46:48.375: E/AndroidRuntime(1381): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.application.testing/com.application.testing.SplashScreen}: java.lang.NullPointerException 
12-21 23:46:48.375: E/AndroidRuntime(1381):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
12-21 23:46:48.375: E/AndroidRuntime(1381):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
12-21 23:46:48.375: E/AndroidRuntime(1381):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
12-21 23:46:48.375: E/AndroidRuntime(1381):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
12-21 23:46:48.375: E/AndroidRuntime(1381):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-21 23:46:48.375: E/AndroidRuntime(1381):  at android.os.Looper.loop(Looper.java:123) 
12-21 23:46:48.375: E/AndroidRuntime(1381):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
12-21 23:46:48.375: E/AndroidRuntime(1381):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-21 23:46:48.375: E/AndroidRuntime(1381):  at java.lang.reflect.Method.invoke(Method.java:521) 
12-21 23:46:48.375: E/AndroidRuntime(1381):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
12-21 23:46:48.375: E/AndroidRuntime(1381):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
12-21 23:46:48.375: E/AndroidRuntime(1381):  at dalvik.system.NativeStart.main(Native Method) 
12-21 23:46:48.375: E/AndroidRuntime(1381): Caused by: java.lang.NullPointerException 
12-21 23:46:48.375: E/AndroidRuntime(1381):  at android.content.ContextWrapper.getResources(ContextWrapper.java:80) 
12-21 23:46:48.375: E/AndroidRuntime(1381):  at com.application.testing.ConfigManager.<init>(ConfigManager.java:22) 
12-21 23:46:48.375: E/AndroidRuntime(1381):  at com.application.testing.SplashScreen.onCreate(SplashScreen.java:22) 
12-21 23:46:48.375: E/AndroidRuntime(1381):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
12-21 23:46:48.375: E/AndroidRuntime(1381):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
12-21 23:46:48.375: E/AndroidRuntime(1381):  ... 11 more 

誰でも知っていますか?

事前のおかげでたくさんのことは、私がおかしくなりそうだので:)

+0

のStackOverflowへようこそ。タイトルに解決されたような質問を記す必要はありません。質問に残された「アイコン/ボックス」は、回答を受け取った後は緑色に変わり、答えを受け入れるとフォントは黄色に変わります。とにかく誰も質問のステータスを見ることができます。 :) –

答えて

3

ConfigManagerActivityを拡張するべきではありません。代わりに、Contextを取るためにそのコンストラクタを変更します。

public ConfigManager(Context context) { 
    prefs = context.getSharedPreferences(
      context.getResources().getString(R.string.preferences), 
      Context.MODE_PRIVATE); 
    loadCfg(); 
} 

をあなたはその後、SplashScreenonCreateConfigManagerActivityを渡すことができます。

cfg = new ConfigManager(this); 
+0

右!それだった!私は、物事を指し示し、 'context.'を' getSharedPreferences() 'に追加したいだけです。 – jila

関連する問題