2014-09-02 75 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