NullPointerException sur le bouton de OnClickListener
Je suis en train d'écrire un jeu Android pour une Intelligence Artificielle semestre de projet. Je suis un NullPointerException sur la Ligne 38 de la classe principale, qui est la setOnClickListener pour le nouveau jeu de bouton à partir de l'écran de lancement.
Sections pertinentes de la Classe WW3Activity:
public class WW3Activity extends Activity
{
public boolean DebugMode = false;
private String buildMenuEmplacement = "";
//[Initialization] Called when the app is first launched
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.startscreen);
//[Initialization] Makes the button resources available to the class
final Button newGame = (Button) findViewById(R.id.buttonNewGame);
final Button loadGame = (Button) findViewById(R.id.buttonLoadGame);
final Button exitGame = (Button) findViewById(R.id.buttonExit);
final Button about = (Button) findViewById(R.id.buttonAbout);
final Button troll = (Button) findViewById(R.id.buttonTroll);
final Button debug = (Button) findViewById(R.id.buttonDebug);
//[Action] When user pushes the New Game button
newGame.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
//Perform action on click
setContentView(R.layout.main);
buttonInitialize();
}
});
//[Action] When user pushes the Exit Game button
exitGame.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
//Perform action on click
finish();
}
});
//[Action] When user pushes the Debug Mode button
exitGame.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
//Perform action on click
DebugMode = true;
}
});
}
//[Initialization] Gets the emplacements ready to be pushed
public void buttonInitialize()
{
final ImageView pe1 = (ImageView) findViewById(R.id.playerEmplacement1);
final ImageView pe2 = (ImageView) findViewById(R.id.playerEmplacement2);
final ImageView pe3 = (ImageView) findViewById(R.id.playerEmplacement3);
final ImageView pc = (ImageView) findViewById(R.id.playerCity);
final ImageView ee1 = (ImageView) findViewById(R.id.enemyEmplacement1);
final ImageView ee2 = (ImageView) findViewById(R.id.enemyEmplacement2);
final ImageView ee3 = (ImageView) findViewById(R.id.enemyEmplacement3);
final ImageView ec = (ImageView) findViewById(R.id.enemyCity);
registerForContextMenu(findViewById(R.id.playerEmplacement1));
registerForContextMenu(findViewById(R.id.playerEmplacement2));
registerForContextMenu(findViewById(R.id.playerEmplacement3));
registerForContextMenu(findViewById(R.id.enemyEmplacement1));
registerForContextMenu(findViewById(R.id.enemyEmplacement2));
registerForContextMenu(findViewById(R.id.enemyEmplacement3));
/*empAction(pe1);
empAction(pe2);
empAction(pe3);
empAction(ee1);
empAction(ee2);
empAction(ee3);
empAction(ec);
empAction(pc);*/
}
Et le LogCat:
10-24 13:29:12.297: D/dalvikvm(440): GC_FOR_ALLOC freed 40K, 4% free 6356K/6595K, paused 177ms
10-24 13:29:12.303: I/dalvikvm-heap(440): Grow heap (frag case) to 6.653MB for 409616-byte allocation
10-24 13:29:12.503: D/dalvikvm(440): GC_FOR_ALLOC freed <1K, 5% free 6755K/7047K, paused 128ms
10-24 13:29:12.614: D/dalvikvm(440): GC_FOR_ALLOC freed 400K, 8% free 6762K/7303K, paused 57ms
10-24 13:29:12.663: D/AndroidRuntime(440): Shutting down VM
10-24 13:29:12.663: W/dalvikvm(440): threadid=1: thread exiting with uncaught exception (group=0x40014760)
10-24 13:29:12.683: E/AndroidRuntime(440): FATAL EXCEPTION: main
10-24 13:29:12.683: E/AndroidRuntime(440): java.lang.RuntimeException: Unable to start activity ComponentInfo{edu.mbijou.cosc473.ww3/edu.mbijou.cosc473.ww3.WW3Activity}: java.lang.NullPointerException
10-24 13:29:12.683: E/AndroidRuntime(440): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815)
10-24 13:29:12.683: E/AndroidRuntime(440): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831)
10-24 13:29:12.683: E/AndroidRuntime(440): at android.app.ActivityThread.access$500(ActivityThread.java:122)
10-24 13:29:12.683: E/AndroidRuntime(440): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024)
10-24 13:29:12.683: E/AndroidRuntime(440): at android.os.Handler.dispatchMessage(Handler.java:99)
10-24 13:29:12.683: E/AndroidRuntime(440): at android.os.Looper.loop(Looper.java:132)
10-24 13:29:12.683: E/AndroidRuntime(440): at android.app.ActivityThread.main(ActivityThread.java:4123)
10-24 13:29:12.683: E/AndroidRuntime(440): at java.lang.reflect.Method.invokeNative(Native Method)
10-24 13:29:12.683: E/AndroidRuntime(440): at java.lang.reflect.Method.invoke(Method.java:491)
10-24 13:29:12.683: E/AndroidRuntime(440): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
10-24 13:29:12.683: E/AndroidRuntime(440): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
10-24 13:29:12.683: E/AndroidRuntime(440): at dalvik.system.NativeStart.main(Native Method)
10-24 13:29:12.683: E/AndroidRuntime(440): Caused by: java.lang.NullPointerException
10-24 13:29:12.683: E/AndroidRuntime(440): at edu.mbijou.cosc473.ww3.WW3Activity.onCreate(WW3Activity.java:38)
10-24 13:29:12.683: E/AndroidRuntime(440): at android.app.Activity.performCreate(Activity.java:4397)
10-24 13:29:12.683: E/AndroidRuntime(440): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
10-24 13:29:12.683: E/AndroidRuntime(440): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779)
10-24 13:29:12.683: E/AndroidRuntime(440): ... 11 more
startscreen.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="493dp"
android:layout_marginTop="217dp"
android:src="@drawable/logo" >
</ImageView>
<Button
android:id="@+id/buttonNewGame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/logo"
android:layout_marginLeft="200dp"
android:layout_marginTop="133dp"
android:clickable="true"
android:text="@string/bNewGame" >
</Button>
<Button
android:id="@+id/buttonLoadGame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/buttonNewGame"
android:layout_alignLeft="@+id/buttonTroll"
android:layout_alignRight="@+id/buttonTroll"
android:clickable="true"
android:text="@string/bLoadGame" >
</Button> <Button
android:id="@+id/buttonExit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/buttonLoadGame"
android:layout_alignBottom="@+id/buttonLoadGame"
android:layout_alignLeft="@+id/buttonDebug"
android:layout_alignRight="@+id/buttonDebug"
android:layout_toRightOf="@+id/buttonLoadGame"
android:clickable="true"
android:text="@string/bExit" >
</Button>
<Button
android:id="@+id/buttonAbout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/buttonNewGame"
android:layout_alignRight="@+id/buttonNewGame"
android:layout_below="@+id/buttonNewGame"
android:layout_marginTop="50dp"
android:text="@string/bAbout" />
<Button
android:id="@+id/buttonTroll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/buttonAbout"
android:layout_alignBottom="@+id/buttonAbout"
android:layout_centerHorizontal="true"
android:text="@string/bTrollface" />
<Button
android:id="@+id/buttonDebug"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/buttonTroll"
android:layout_toRightOf="@+id/buttonTroll"
android:layout_marginLeft="200dp"
android:text="@string/bDebug" />
</RelativeLayout>
J'ai d'abord eu un NullPointerException parce que j'ai déclaré l'ensemble des boutons avant, j'ai changé le mode de mise à startscreen, mais j'ai corrigé ça, et puis ce qui s'est passé. Techniquement, c'EST les devoirs, mais je ne pense pas que cela justifie les devoirs de la balise parce que ce n'est pas un devoir-y type de problème, parce que le problème n'a rien à voir avec la cession elle-même.
S'il vous plaît ajouter votre startscreen.xml fichier de mise en page. IMO le buttonNewGame n'est pas dans cette disposition. C'est pourquoi findViewById renvoie la valeur null, jetant ainsi un NullPointerException lorsque vous essayez d'appeler une méthode de ce bouton.
OriginalL'auteur Mike | 2011-10-24
Vous devez vous connecter pour publier un commentaire.
La seule raison pour laquelle
findViewById()
serait de retournull
est parce que la Vue vous êtes à la recherche pour n'appartient pas à la Vue actuelle. (Le point de Vue que vous définissez avecsetContentView()
). SiR.id.buttonNewGame
est dansR.layout.startscreen
, essayez de nettoyer et reconstruire votre projet.Nettoyer et reconstruire l'a fait.
que faire si nous voulons utiliser le bouton de toute autre disposition
OriginalL'auteur Blackbelt
Il semblerait que
newGame
est null. Avez-vous plusieurs mises en page nommées startscreen.xml? Une cause fréquente de cette exception serait la création d'buttonNewGame dans une version mais pas les autres, ce qui amènerait le code à compiler correctement, mais ne parviennent pas au moment de l'exécution, exactement comme vous le décrivez, lors de la mise en page active a omis de spécifier le bouton.Merci pour cette réponse, je commençais à devenir fou parce que le bouton n'a pas été une partie d'un autre point de vue ou quelque chose comme ça. Mon problème était que j'étais dans le processus de soutien pour plusieurs tailles d'écran et j'ai ajouté un bouton qui n'était pas dans toutes les mises en page.
OriginalL'auteur mah
Je vois cette erreur périodiquement, le problème dans mon cas est que android inpropertly maintien de la même id dans différentes mises en page. Assurez-vous que votre id sont uniques non seulement à l'intérieur de la mise en page, mais dans l'ensemble de l'application.
et où sont vos R. id.playerEmplacement1 et ainsi de suite déclaré?
Dans le main.xml.
bien, mais dans votre activité vous permet d'utiliser startscreen, tous les éléments de main.xml sont pas disponible ici... passer votre buttonInitialize fonction de l'activité de votre main.xml
En cliquant sur nouveau jeu de jeux de la contentview à la main, et c'est là que les emplacements et les villes sont déclarés et utilisés.
OriginalL'auteur Raiv
Définir un point d'arrêt sur la ligne 38 et lancer le débogueur. Vous êtes le plus susceptible d'essayer de faire référence à un bouton à l'extérieur du fichier xml R. layout.startscreen qui lancerait une NullPointerException.
OriginalL'auteur Ljdawson