3

J'ai un problème de débutant. Voici ma situation:Nouvelle activité nullpointerexception

Je veux commencer une nouvelle activité de l'activité principale. Le code permettant de lancer la nouvelle activité se trouve dans un fichier de classe distinct. Je semble passer les mauvais arguments et je me retrouve dans une nullpointerexception en essayant de lancer la nouvelle activité. La nouvelle activité se lance correctement lorsque je place le code dans le fichier de classe d'activité principal, donc la deuxième activité et le manifeste sont corrects. Voici un exemple de mon code:

Dans ma classe principale d'activité où j'instancier la deuxième classe (CECI EST MON ACTIVITÉ PRINCIPALE J'OMITTED LE RESTE CAR JE NE PENSE PAS IL EST LIÉE AU PROBLÈME.):

Tester mytest = new Tester(); 
mytest.test(this); 

Dans mon deuxième fichier de classe (CECI EST PAS uNE ACTIVITÉ, IL EST uNE cLASSE instancié DANS l'ACTIVITÉ):

public class Tester extends Activity { 
    Intent myIntent; 
    public void test (Context context) { 
       myIntent = new Intent (Intent.ACTION_VIEW); 
       myIntent.setClass(context, newActivity.class); 
       thebutton.setOnClickListener(
      new OnClickListener() { 
       public void onClick(View v) { 
        startActivity(myIntent); 
       } 
      }  
     ):} 

Lorsque j'effectue le clic que je reçois un NullPointerException à startactivity. Quelqu'un peut-il m'éclairer s'il vous plaît? Je suis sûr que j'utilise à tort le contexte.

Répondre

4

Les activités démarrent avec Intents. Veuillez d'abord lire le Android Application Fundamentals et essayer l'application Hello World :)

J'ai compris que vous utiliseriez votre classe de testeur séparée à tout prix;) donc j'essaye de m'adapter et de vous aider.

Tout d'abord, ne laissez pas laisser votre classe hériter de l'activité. Cela ne vous aidera pas, car ces appels n'auront probablement aucun contexte valide. L'activité implémente en quelque sorte le modèle de modèle , vous fournissant la méthode clé comme onCreate(...), onPause(...) etc et est instancié par le système d'exploitation Android.

Si vous voulez toujours utiliser la classe, vous devez passer dans le contexte. Probablement que vous visez une certaine structure de modèle MVC/MVP, de toute façon.

public class Tester { 
    private Context context; 
    public Tester(Context context){ 
     this.context = context; 
    } 

    public void test() { 
     final Intent myIntent = new Intent(context, NewActivity.class); 

     //guess this comes from somewhere, hope through a findViewById method 
     thebutton.setOnClickListener(
       new OnClickListener() { 
       public void onClick(View v) { 
        context.startActivity(myIntent); 
       } 
       }  
     )}; 
    } 
} 

Ceci serait une solution proposée de mon côté. Un problème que je vois encore ici est sur comment vous récupérez le bouton dans cette méthode test(). Pour que cela fonctionne correctement, vous devez le récupérer dans une classe View (avec view.findViewByid(R.id.myButton)) ou le créer dynamiquement et l'associer à la vue pendant le onCreate(...) de votre activité (probablement en utilisant un Inflater).

+0

L'onclick (vue v) se trouve dans un fichier de classe distinct. dois-je étendre la classe à l'activité pour pouvoir utiliser startactivity ou d'une autre manière? – Yash

+0

Vous aurez besoin d'un contexte pour utiliser startActivity: http://goo.gl/Wp60 – Juri

+0

Juste pour la curiosité: quelle est la raison d'avoir l'événement onClick dans une classe séparée? Dans votre code ci-dessus: Je ne prolongerais pas d'activité, mais plutôt si vous avez besoin, passez le Contexte de l'activité dans le constructeur de votre classe Tester et ensuite utilisez le contexte pour invoquer des actions comme startActivity (..) etc. – Juri