2014-09-02 64 views
0

所以我有一個Activity並調用另一個類,只要它試圖獲得共享首選項就崩潰了。方法類在共享首選項上崩潰

這裏是我的電話在活動

Methods_play test1 = new Methods_play(); 
String[] tmp1 = test1.pewpew(level); 

代碼,並在這裏從我的方法類

package 


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

    public class Methods_play extends Activity { 

     public String[] pewpew(int level) { 

      //GETS STUFF 
      Random rn = new Random(); 
      !!!HERE IS THE ERROR!!! SharedPreferences prefs = getSharedPreferences(getResources().getString(R.string.preferences), MODE_PRIVATE); 
      Editor editor = prefs.edit(); 

      //SOME CODE 

      //RETRUNS ARRAY 
      String ar[] = new String[2]; 
      ar[0]= button1text; 
      ar[1]= button2text; 
      return ar; 

     } 

    } 

我在做什麼錯誤的代碼?我已經在清單文件中聲明瞭它(並且我沒有,但它無論如何都崩潰了)。在普通活動中,get共享首選項代碼有效。

它第一次嘗試在android中使用方法類,所以我非常確定我搞砸了。

旁註:有沒有什麼好的教程呢?

謝謝你的幫助!

EDIT(第23行是我說的崩潰,159是在調用方法和143是在活動的onCreate方法的調用defineqacall方法):

09-03 01:36:01.742: E/AndroidRuntime(14001): FATAL EXCEPTION: main 
09-03 01:36:01.742: E/AndroidRuntime(14001): Process: eu.jbr.quizexo, PID: 14001 
09-03 01:36:01.742: E/AndroidRuntime(14001): java.lang.RuntimeException: Unable to start activity ComponentInfo{eu.jbr.quizexo/eu.jbr.quizexo.Career_Play}: java.lang.NullPointerException 
09-03 01:36:01.742: E/AndroidRuntime(14001): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2212) 
09-03 01:36:01.742: E/AndroidRuntime(14001): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271) 
09-03 01:36:01.742: E/AndroidRuntime(14001): at android.app.ActivityThread.access$800(ActivityThread.java:144) 
09-03 01:36:01.742: E/AndroidRuntime(14001): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205) 
09-03 01:36:01.742: E/AndroidRuntime(14001): at android.os.Handler.dispatchMessage(Handler.java:102) 
09-03 01:36:01.742: E/AndroidRuntime(14001): at android.os.Looper.loop(Looper.java:136) 
09-03 01:36:01.742: E/AndroidRuntime(14001): at android.app.ActivityThread.main(ActivityThread.java:5146) 
09-03 01:36:01.742: E/AndroidRuntime(14001): at java.lang.reflect.Method.invokeNative(Native Method) 
09-03 01:36:01.742: E/AndroidRuntime(14001): at java.lang.reflect.Method.invoke(Method.java:515) 
09-03 01:36:01.742: E/AndroidRuntime(14001): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796) 
09-03 01:36:01.742: E/AndroidRuntime(14001): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612) 
09-03 01:36:01.742: E/AndroidRuntime(14001): at dalvik.system.NativeStart.main(Native Method) 
09-03 01:36:01.742: E/AndroidRuntime(14001): Caused by: java.lang.NullPointerException 
09-03 01:36:01.742: E/AndroidRuntime(14001): at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:173) 
09-03 01:36:01.742: E/AndroidRuntime(14001): at eu.jbr.quizexo.Methods_play.defineqa(Methods_play.java:23) 
09-03 01:36:01.742: E/AndroidRuntime(14001): at eu.jbr.quizexo.Career_Play.defineqacall(Career_Play.java:159) 
09-03 01:36:01.742: E/AndroidRuntime(14001): at eu.jbr.quizexo.Career_Play.onCreate(Career_Play.java:143) 
09-03 01:36:01.742: E/AndroidRuntime(14001): at android.app.Activity.performCreate(Activity.java:5231) 
09-03 01:36:01.742: E/AndroidRuntime(14001): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
09-03 01:36:01.742: E/AndroidRuntime(14001): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169) 
09-03 01:36:01.742: E/AndroidRuntime(14001): ... 11 more 
+2

崩潰。怎麼樣?棧? – 2014-09-02 23:44:10

回答

0

由於Methods_play extends Activity必須執行某些方法,如onCreate(Bundle myBundle)。此外,SharedPreferences需要一個Context,所以你不能初始化它之前onCreate()因爲沒有Context可用。嘗試類似

// declare it 
SharedPreferences prefs; 

public class Methods_play extends Activity { 

    public void onCreate(Bundle someBundle) 
    { 
     super.onCreate(someBundle); 
     //initialize it 
     prefs = getSharedPreferences(getResources().getString(R.string.preferences), MODE_PRIVATE); 

由於MikeM在評論中指出,它不會出現,你需要擴展Activity。不要擴展任何東西,創建構造函數,將其傳遞給Activity Context,然後使用它訪問SharedPreferences

public class Methods_play { 

    // create a member variable for your context 
    Context mContext; 

    //Create the constructor which takes a context 
    public void Methods_play(Context c) 
    { 
     mContext = c; 
    } 

    public String[] pewpew(int level) { 

     //GETS STUFF 
     Random rn = new Random(); 

     // Use your context below 
     SharedPreferences prefs = mContext.getSharedPreferences(getResources() 
       .getString(R.string.preferences), MODE_PRIVATE); 
     Editor editor = prefs.edit(); 
+1

鑑於帖子中的第一個代碼塊,我認爲'Methods_play'不需要是一個Activity子類,並且OP只是這樣做,以便'getSharedPreferences()'能夠解決。我認爲帶有Context參數的構造函數可能是這裏需要的。 – 2014-09-03 00:42:28

+0

@MikeM。這很可能。我無法考慮所有可能的情況。關鍵是,'SharedPreferences'需要一個'Context' – codeMagic 2014-09-03 00:54:58

+0

瞭解。無論如何,這個評論更多的是OP。我知道你知道你在做什麼。 ;-) – 2014-09-03 00:58:36