2010-09-13 6 views
1

Je tente Google University Android lab1 de modifier le contenu d'un texte TextView en fonction de la valeur transmise via l'intention d'une autre activité.Android TextView.setText force se ferme

J'ai essayé le reste de mon code mais ... Pourquoi est-ce que mon application se ferme lorsque j'ajoute la ligne "tv.settext (...)"?

public class HelloWorld extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     /* 
     * Fetch and display passed string. 
     */ 
     TextView tv = (TextView) findViewById(R.id.HelloTV); 
     Bundle extras = this.getIntent().getExtras(); 
     if (extras != null) { 
      String nameStr = extras.get("Username").toString(); 
      if (nameStr != null) { 
       tv.setText("Hello "+nameStr);   
      } 
     } 
     setContentView(R.layout.main); 
    } 
} 
+0

extras.get ("Nom d'utilisateur"), vérifiez cette valeur, cela pourrait être nul. Voir dans le logcat. – bhups

+0

Pouvez-vous publier le journal des erreurs et la mise en page XML ici? En ce moment, on dirait que 'tv' peut être nul sur la ligne. –

+0

@bhups - Je vérifie le nom d'utilisateur, n'est-ce pas? - if (nameStr! = null) ... – Dizzley

Répondre

10

En regardant le journal des erreurs, et mieux encore, regarder une session de débogage - on peut voir qu'il ya une exception de pointeur nul sur la ligne 22:

  tv.setText("Hello "+nameStr);   

C'est parce que tv = = null. Il aurait dû être mis en service par la ligne:

TextView tv = (TextView) findViewById(R.id.HelloTV); 

mais d'utiliser l'identifiant dans la mise en page, vous devez toujours enregistrer le point de vue de l'activité actuelle. Cette ligne aurait dû être inclus au début de la méthode onCreate:

setContentView(R.layout.main); 

Voici la classe Helloworld travail:

public class HelloWorld extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     /* 
     * Fetch and display passed string. 
     */ 
     TextView tv = (TextView) findViewById(R.id.HelloTV); 
     Bundle extras = this.getIntent().getExtras(); 
     if (extras != null) { 
      String nameStr; 
      if (extras.get("Username") != null) { 
       nameStr = extras.get("Username").toString(); 
       tv.setText("Hello "+nameStr);   
      } 
     } 
    } 
} 

Cette classe Helloworld récupère correctement le nom de l'utilisateur à partir des extras envoyés lorsque l'activité commence et affiche un message d'accueil personnalisé.

J'ai trouvé la réponse grâce à Konstantin Burov et la question précédente here

0

Avez-vous un seul fichier .xml dans le dossier du projet de mise en page? Si vous avez un fichier xml pour l'activité principale et un fichier fragment.xml tel qu'il est proposé par eclipse mis à jour, vous devez faire le setText dans la fonction "onCreateView" générée automatiquement. C'est là que le fragment (qui contient les éléments de vue) et la disposition principale sont combinés. trouvent si la ligne ci-dessous dans votre code ou créer:

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { ... } 

puis définir le texte ou d'autres éléments nécessaires de votre point de vue (tels que BTN, textView ...) dans cette fonction. tel que:

 public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_main, container, 
       false); 

        //set the text of textView 
     TextView txvMain = (TextView) rootView.findViewById(R.id.txvMain); 
     txvMain.setText("SetText works now"); 

        //set a drawable as the background of the textView 
     txvMain.setBackgroundResource(drawable.ic_launcher); 

     return rootView; 
    } 

Je me réjouis de toute autre question.

Questions connexes