2013-08-14 3 views
0

J'ai un ListView avec chaque ligne contenant un TextView. Au clic de l'utilisateur, j'obtiens la valeur du TextView et je le stocke dans une variable String, et l'utilisateur est dirigé vers une autre activité où il/elle doit entrer des données sur ledit TextView. Afin de ne pas perdre l'état d'information de la première activité, j'ai dû utiliser startActivityForResult() et plus tard obtenir les informations de la deuxième activité avec la méthode onActivityResult(). Le problème est le suivant: J'ai besoin de comparer une valeur avec celle de TextView en question, cependant la variable String qui contient supposément la valeur de TextView est null.La valeur de chaîne est nulle

Avant de démarrer la deuxième activité, je grille la valeur String et renvoie la chaîne correcte, mais pas dans le onActivityResult(), où elle renvoie null.

Pourquoi cela se produit-il? L'intention que j'ai utilisée n'est-elle pas censée conserver toutes les informations de l'activité ouverte?

onItemClick de ListView

@Override 
     public void onItemClick(AdapterView<?> listView, View itemView, int itemPosition, long itemID) 
     { 


      clickedError = ((TextView)itemView).getText().toString(); 
      String errorIDQuery = "SELECT _id FROM " + TABLE_ERROR + " WHERE error_description LIKE '" + clickedError + "';"; 

       Cursor getErrorID = db.rawQuery(errorIDQuery, null); 
       getErrorID.moveToFirst(); 
       errorID = getErrorID.getInt(0); 

      Intent intent = new Intent(Repair.this, Material.class); 
      intent.putStringArrayListExtra("materialList", materialList); 
      startActivityForResult(intent, 1); 
      Toast.makeText(getApplicationContext(), clickedError, Toast.LENGTH_LONG).show(); 
     } 

onActivityResult

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if(resultCode == RESULT_OK) 
    { 
     @SuppressWarnings("unchecked") 
     HashMap <String, String> materialDetails = (HashMap <String, String>)data.getSerializableExtra("map"); 
     Set<?> set = materialDetails.entrySet(); 
     Iterator<?> i = set.iterator(); 

     ArrayList<String> materialNames = new ArrayList<String>(); 
     ArrayList<String> materialAmounts = new ArrayList<String>(); 

     do 
     { 
      @SuppressWarnings("rawtypes") 
      Map.Entry me = (Map.Entry)i.next(); 

      materialNames.add(me.getKey().toString()); 
      materialAmounts.add(me.getValue().toString()); 
     } 
     while (i.hasNext()); 

     for(Error e : errorList) 
     { 
      // ----- COMPARING THE VALUES ----- 
      // here clickedError is null 
      if(e.description.equals(clickedError)) 
      { 
       for(int j = 0; j < materialNames.size(); j++) 
       { 
        MaterialClass mc = new MaterialClass(); 
        mc.setName(materialNames.get(j)); 
        mc.setAmount(Integer.parseInt(materialAmounts.get(j))); 
        e.materialList.add(mc); 
       } 
       if (e.materialList.size() != 0) 
        e.checked = true; 
       else 
        e.checked = false; 
      } 
} 

Répondre

0

Faites votre valeur de chaîne statique afin qu'il conserve sa valeur. ou vous pouvez utiliser la préférence partagée pour enregistrer la valeur et l'utiliser plus tard.

+0

Merci. Ce n'était pas statique. Je n'ai même pas vérifié ça. – ClaireG

+2

Tout en rendant la valeur statique lui permet de conserver sa valeur entre les instances, c'est une mauvaise pratique. Vous ne seriez pas en mesure d'utiliser plus d'une instance distincte de cette classe sans interférence. La réponse de @delblanco (http://stackoverflow.com/a/18227585/316424) me semble plus appropriée. –

0

Cela fonctionne si elle me demandez pas

TextView textviewDate=(TextView)findViewById(R.id.yourtextviewid); 
clickedError=textviewDate.getText().toString(); 
+0

Merci pour votre réponse, mais le problème a été résolu. – ClaireG

2

Je pense: l'activité est détruite et redémarré tout en se déplaçant à la deuxième activité. Ceci est facile à confirmer avec les messages de journal dans les méthodes de cycle de vie de l'activité (onCreate/onRestart/etc).

Le lien suivant pourrait être utile pour maintenir les données lors de la commutation d'activité: http://developer.android.com/training/basics/activity-lifecycle/recreating.html

+0

Merci pour votre réponse, mais le problème a été résolu. – ClaireG

+0

Le rendre statique a quelques inconvénients architecturaux. Par exemple, clickedError conserve sa valeur jusqu'à ce que le processus de l'application soit détruit. Cela pourrait interférer avec les appels onActivityResult. Jetez un oeil à [this] (http://stackoverflow.com/questions/3639860/static-variables-in-android) et [this] (http://www.offthehill.org/ articles/2011/06/03/java-static-variables-sont-faux-presque-toujours /) – Delblanco

Questions connexes