pearmak
pearmak

Reputation: 5027

android: bundle string-array from one activity to another

I am making a quiz where the question and answer lists are needed to pass from activity 1 to activity 2. Relevant Codings extracted as follows:

Activity 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    

Activity 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)

Line 73 is

NUM_ALL_QuestionNames = bundle.getStringArray("dataQ"); 

which means the StringArray is not properly stored in Activity1 or cannot properly fetched in Activity2. It shows NullPointerException.

Question:

I have searched through this website like String back from Bundle , and How to pass the selectedListItem's object to another activity? and follow the method described but still fails. But why it is NullPointerException? How can this be tackled?

Many thanks!!

PS: In Activity 1 I have

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

and k gives out a correct number of items. This means NUM_ALLL_QuestionNames is not blank.

Upvotes: 0

Views: 1731

Answers (2)

Vector
Vector

Reputation: 41

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

You should send your bundle of data with your second intent. And remove the first intent completely.

Upvotes: 4

ρяσѕρєя K
ρяσѕρєя K

Reputation: 132982

As in your Current Code You are starting Num.class Activity two Times first using startActivity(senddata); and second time startActivity(intent); which contains no bundle object that's why you are getting NullPointerException

Upvotes: 2

Related Questions