0

アクティビティ1からアクティビティ2に渡すために質問と回答のリストが必要なクイズを作成しています。関連するコーディングは次のように抽出されます。

アクティビティ1:Num_index.java

   String[] NUM_ALLL_QuestionNames; 
   String[] NUM_ALLL_AnswerNames;   

   @Override
   public void onCreate(Bundle savedInstanceState) 
   {
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main_num_index); 

      Button ButtonStart= (Button) findViewById(R.id.buttonStart);
      ButtonStart.setOnClickListener(startButtonListener);

      Button ButtonBackkk= (Button) findViewById(R.id.buttonBackkk);

      CheckTextView = (TextView) findViewById(R.id.checktextView); 

      NUM_SIM_QuestionNames = getResources().getStringArray(R.array.Num_Q_Simple_List);
      NUM_MED_QuestionNames = getResources().getStringArray(R.array.Num_Q_Medium_List);
      NUM_DIF_QuestionNames = getResources().getStringArray(R.array.Num_Q_Diff_List);
      NUM_EXP_QuestionNames = getResources().getStringArray(R.array.Num_Q_Expert_List);

      NUM_SIM_AnswerNames = getResources().getStringArray(R.array.Num_A_Simple_List);
      NUM_MED_AnswerNames = getResources().getStringArray(R.array.Num_A_Medium_List);
      NUM_DIF_AnswerNames = getResources().getStringArray(R.array.Num_A_Diff_List);
      NUM_EXP_AnswerNames = getResources().getStringArray(R.array.Num_A_Expert_List);

      NUM_ALL_QuestionNames = new ArrayList<String>();
      NUM_ALL_AnswerNames = new ArrayList<String>();                              
   };

   private OnClickListener startButtonListener = new OnClickListener() 
   {
      @Override
      public void onClick(View v) 
      {
          CheckBox CheckSim = (CheckBox) findViewById(R.id.checkBox2);
          // other similar checkBox omitted here for simplicity // 

          NUM_ALL_QuestionNames.clear();
          NUM_ALL_AnswerNames.clear();  

          if (CheckSim.isChecked()) 
          {
              QuestionImport= 0;                  
              QuestionImport = NUM_SIM_QuestionNames.length;
              int i =0;
              while (i<QuestionImport)
              {
                  String Q_toimport = NUM_SIM_QuestionNames[i];
                  String A_toimport = NUM_SIM_AnswerNames[i];   

                  NUM_ALL_QuestionNames.add(Q_toimport);
                  NUM_ALL_AnswerNames.add(A_toimport);                    
                  ++i;                    
              }           
          };    

         // other similar checkBox omitted here for simplicity // 

          if ((!CheckSim.isChecked()) && (!CheckMed.isChecked()) && (!CheckDif.isChecked()) && (!CheckExp.isChecked()))  
          {
              int k = 0;
              if (NUM_ALL_QuestionNames.size() >0) {k= NUM_ALL_QuestionNames.size();}
              CheckTextView.setText(String.valueOf(k));

                AlertDialog.Builder builder = new AlertDialog.Builder(Num_index.this);
                builder.setTitle("Error");
                builder.setMessage("Please select at least one choice!!");
                builder.setCancelable(false);
                builder.setPositiveButton("OK", null);                 
                AlertDialog ErrorDialog = builder.create();
                ErrorDialog.show();                   
          }

          if ((CheckSim.isChecked()) || (CheckMed.isChecked()) || (CheckDif.isChecked()) || (CheckExp.isChecked()))  
          {
              NUM_ALLL_QuestionNames = new String[NUM_ALL_QuestionNames.size()]; //convert ArrayList<String> to String[]
              NUM_ALLL_AnswerNames = new String[NUM_ALL_AnswerNames.size()]; //convert ArrayList<String> to String[]

              Intent senddata = new Intent (Num_index.this, Num.class); //transmit the list to num.java
              Bundle bundle = new Bundle();
              bundle.putStringArray("dataQ",NUM_ALLL_QuestionNames);
              bundle.putStringArray("dataA",NUM_ALLL_AnswerNames);
              senddata.putExtras(bundle);
              startActivity(senddata);                            

              int k = 0;
              if (NUM_ALLL_QuestionNames.length >0) {k= NUM_ALLL_QuestionNames.length;}
              CheckTextView.setText(String.valueOf(k));                                   
          }           

           Intent intent = new Intent (Num_index.this, Num.class);
           startActivity(intent);
           Num_index.this.finish();               

      } // end method onClick
   }; // end OnClickListener    

アクティビティ2:Num.java

   private String[] NUM_ALL_QuestionNames;
   private String[] NUM_ALL_AnswerNames;

   @Override
   public void onCreate(Bundle savedInstanceState) 
   {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main_num); 

      //get bundle from Num_index.java
      Bundle bundle = this.getIntent().getExtras();
      if (bundle!= null)
      {
          NUM_ALL_QuestionNames = bundle.getStringArray("dataQ");
          NUM_ALL_AnswerNames = bundle.getStringArray("dataA");          
      }
      else
      {
          NUM_ALL_QuestionNames = getResources().getStringArray(R.array.Num_Q_Simple_List);
          NUM_ALL_AnswerNames = getResources().getStringArray(R.array.Num_A_Simple_List);             
      }

Logcat:

11-18 20:26:20.905: E/AndroidRuntime(5463): FATAL EXCEPTION: main
11-18 20:26:20.905: E/AndroidRuntime(5463): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pearappx.iq_3/com.pearappx.iq_3.Num}: java.lang.NullPointerException
11-18 20:26:20.905: E/AndroidRuntime(5463):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at android.app.ActivityThread.access$600(ActivityThread.java:127)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at android.os.Looper.loop(Looper.java:137)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at android.app.ActivityThread.main(ActivityThread.java:4511)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at java.lang.reflect.Method.invokeNative(Native Method)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at java.lang.reflect.Method.invoke(Method.java:511)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at dalvik.system.NativeStart.main(Native Method)
11-18 20:26:20.905: E/AndroidRuntime(5463): Caused by: java.lang.NullPointerException
11-18 20:26:20.905: E/AndroidRuntime(5463):     at com.pearappx.iq_3.Num.onCreate(Num.java:73)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at android.app.Activity.performCreate(Activity.java:4470)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)

73行目は

NUM_ALL_QuestionNames = bundle.getStringArray("dataQ"); 

つまり、StringArrayがActivity1に適切に格納されていないか、Activity2で適切にフェッチできません。NullPointerExceptionが表示されます。

質問:

BundleからStringのようにこのウェブサイトを検索しましたが、selectedListItemのオブジェクトを別のアクティビティに渡す方法は?説明されている方法に従いますが、それでも失敗します。しかし、なぜそれがNullPointerExceptionなのですか?これにどのように取り組むことができますか?

どうもありがとう!!

PS:アクティビティ1で私は

              if (NUM_ALLL_QuestionNames.length >0) {k= NUM_ALLL_QuestionNames.length;}
              CheckTextView.setText(String.valueOf(k)); 

kは正しい数のアイテムを出します。これは、NUM_ALLL_QuestionNamesが空白ではないことを意味します。

4

2 に答える 2

4

http://developer.android.com/guide/components/activities.html#StartingAnActivity

2 番目のインテントでデータのバンドルを送信する必要があります。そして、最初の意図を完全に削除します。

于 2012-11-18T12:50:44.717 に答える
2

現在のコードのように、Num.class最初に2回使用してアクティビティを開始しstartActivity(senddata); 、2回目 startActivity(intent);はバンドルオブジェクトを含まないため、取得していますNullPointerException

于 2012-11-18T12:49:14.453 に答える