2017-09-30 4 views
2

J'ai une méthode de commutation onClick dans MainActivity.java et les boutons sont créés dans programme Navigation.java. Le menu initial nav.mainMenu() est appelé correctement et le bouton est créé comme prévu. Mon problème est que lorsque je clique sur le bouton, rien ne se passe.Android créé par programmation bouton onClick de la classe

Je n'obtiens aucune trace de pile d'erreurs dans le logcat. J'ai essayé de mettre des logs dans la méthode onclick, mais ça ne va pas aussi loin. L'émulateur semble fonctionner et ne gèle pas ou ne plante pas.

Je suppose que lorsque j'envoie le code au menu, l'activité est dans cette classe? alors quand j'essaie d'utiliser le onClickListener dans MainActivity, il n'est pas au courant?

Je suis également pas sûr de ce que j'attendrai de v.getId() dans MainActivity.javaR.id.btnGame?

MainActivity.java

public class MainActivity extends Activity implements View.OnClickListener { 

    public Navigation nav = new Navigation(this); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.empty); 
    nav.mainMenu(); 
    } 

    @Override 
    public void onClick(View v) { 
    switch(v.getId()) { 
     case R.id.btnGame: 
     nav.game(); 
     break; 
    } 
    } 
} 

Navigation.java

public class Navigation { 

    Button btnGame; 

    Context mContext; 
    Navigation(Context mContext) { 
    this.mContext = mContext; 
    } 

    public void mainMenu() { 
    LinearLayout ll = new LinearLayout(mContext); 
    ll.removeAllViews(); 
    LinearLayout.LayoutParams llP = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); 
    ll.setLayoutParams(llP); 
    ll.setOrientation(LinearLayout.VERTICAL); 
    LinearLayout.LayoutParams btnParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 

    btnGame = new Button(mContext.getApplicationContext()); 
    btnGame.setLayoutParams(btnParams); 
    btnGame.setText("Play Game"); 
    ll.addView(btnGame); 

    Activity activity = (Activity) mContext; 
    activity.setContentView(ll); 
    } 

    public void game() { 
    Toast.makeText(mContext, "I dont see this", Toast.LENGTH_SHORT).show(); 
    } 
} 
  • J'ai essayé d'ajouter .setOnClickListener() aux boutons Navigation.java mais je ne peux pas bien situer le contexte, je ne sais pas si c'est ce que est manquant.

  • Étendre Navigation.java à MainActivity ou Activity me donne une boucle d'erreurs.

Logcat après l'application a été construit sur l'émulateur:

09-30 17:43:59.655 7038-7038/? I/art: Not late-enabling -Xcheck:jni (already on) 
09-30 17:43:59.655 7038-7038/? W/art: Unexpected CPU variant for X86 using defaults: x86 
09-30 17:43:59.854 7038-7038/com.fomtirth.barcodebattle W/System: ClassLoader referenced unknown path: /data/app/com.fomtirth.barcodebattle-2/lib/x86 
09-30 17:43:59.867 7038-7038/com.fomtirth.barcodebattle I/InstantRun: starting instant run server: is main process 
09-30 17:44:00.230 7038-7066/com.fomtirth.barcodebattle I/OpenGLRenderer: Initialized EGL, version 1.4 
09-30 17:44:00.230 7038-7066/com.fomtirth.barcodebattle D/OpenGLRenderer: Swap behavior 1 
09-30 17:44:00.230 7038-7066/com.fomtirth.barcodebattle W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without... 
09-30 17:44:00.230 7038-7066/com.fomtirth.barcodebattle D/OpenGLRenderer: Swap behavior 0 
09-30 17:44:00.234 7038-7066/com.fomtirth.barcodebattle D/EGL_emulation: eglCreateContext: 0x9baa38c0: maj 2 min 0 rcv 2 
09-30 17:44:00.241 7038-7066/com.fomtirth.barcodebattle D/EGL_emulation: eglMakeCurrent: 0x9baa38c0: ver 2 0 (tinfo 0x99a887d0) 
09-30 17:44:00.293 7038-7066/com.fomtirth.barcodebattle D/EGL_emulation: eglMakeCurrent: 0x9baa38c0: ver 2 0 (tinfo 0x99a887d0) 
09-30 17:44:00.400 7038-7066/com.fomtirth.barcodebattle D/EGL_emulation: eglMakeCurrent: 0x9baa38c0: ver 2 0 (tinfo 0x99a887d0) 
09-30 17:44:00.460 7038-7066/com.fomtirth.barcodebattle D/EGL_emulation: eglMakeCurrent: 0x9baa38c0: ver 2 0 (tinfo 0x99a887d0) 
+1

Quelles sont les erreurs? Pouvez-vous leur montrer? –

+0

Je ne reçois aucune erreur, le logcat est vide après la construction. Je vais modifier ci-dessus pour inclure la sortie de construction. – TomFirth

+0

Avez-vous filtré les erreurs? –

Répondre

2

Vous ne pouvez pas affecter un contexte d'un champ. Vous ne pouvez probablement pas "assigner un droit", parce que vous obtenez une exception nullpointer et que vous modifiez le mauvais emplacement. Cela étant dit, getApplicationContext() n'est pas nécessaire.

De même, pourrais-je vous suggérer de renvoyer la mise en page du contenu plutôt que de transformer le contexte en activité? À première vue, je vois que vous n'avez jamais défini d'écouteur de clic sur le bouton, donc vous devriez probablement le faire.

Par exemple

Context mContext; 
View.OnClickListener mClickListener; 

Navigation(Context context) { 
    this.mContext = context; 
    if (context instanceof View.OnClickListener) { 
     this.mClickListener = (View.OnClickListener) context ; 
    } 
} 

utiliser maintenant ce

if (mClickListener!=null) { 
    button.setOnClickListener(mClickListener); 
} 

Je suis également pas sûr de ce que j'attendrai de v.getId() dans MainActivity.java R.id. btnGame?

L'ID ne correspond pas au nom de la variable. Sans donner explicitement le bouton un ID, ce sera -1

+0

J'avais essayé de déplacer la définition de classe dans la méthode onCreate mais je ne pensais pas que était le problème que l'appel de menu initial était encore fait. Je l'ai déplacé et ne vois aucune différence. J'ai enlevé 'getApplicationContext()'. Donc maintenant je le laisse comme 'btnGame = new Button (mContext);'? Je ne reçois aucune réponse de cela non plus. – TomFirth

+0

C'est génial. Je ne pouvais pas savoir comment ajouter un clickListener au bouton! – TomFirth

+1

Votre auditeur peut être implémenté partout où vous en avez besoin. Vous pouvez également ajouter une méthode setOnClickListener à votre classe de navigation –