2011-08-21 8 views
8

Ciao, sto scrivendo una piccola app per Android (Versione 2.3.3). Ora ho questa strana eccezione NullPointer in questo codice molto semplice:NullPointerException in onCreate() quando si utilizza findViewById - setContentView è usato prima?

public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.mainmenu); 

newDeck = (Button) findViewById(R.id.newDeckB); 
loadDeck = (Button) findViewById(R.id.loadDeckB); 
viewEdition = (Button) findViewById(R.id.viewEditionB); 

newDeck.setOnClickListener(this); 
loadDeck.setOnClickListener(this); 
viewEdition.setOnClickListener(this); 
} 

Im usando questo layout semplice nel momento in menu.xml principale:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 
<Button android:id="@+id/newDeckB" 
     android:text="New Deck" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"/> 
<Button android:id="@+id/loadDeckB" 
     android:text="Load Deck" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"/> 
<Button android:id="@+id/viewEditionB" 
     android:text="View Edition" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"/> 
<TextView android:id="@+id/currentDeckTextView" 
     android:text="Default Deck" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
</LinearLayout> 

Ora il mio problema è un nullpointexception in linea 25 , che è la linea dove i impostare il primo clickListener

newDeck.setOnClickListener(this); 

Utilizzo del debugger ho capito che il pulsante newDeck è nullo. Ho cercato molto sul web ma l'unica risposta a questo tipo di problemi è stata controllare che setContentView sia impostato prima di findViewById. Questo è ovviamente il caso qui.

Sarei molto contento per qualsiasi tipo di consiglio.

Thx in Prima!

+0

Vuol 'R.id.newDeckB' in realtà esistono in' R.layout.mainmenu'? –

+0

Avevo lo stesso identico problema (frustrante!), Ed è stato il commento qui sotto (@manelizzard) a risolverlo: "A volte è necessario" pulire "e ricostruire il progetto per ottenere le risorse corrette compilate, è qualcosa da Eclipse '. (Ad esempio, non è necessario usare 'onPostCreate()'!) – coco

+0

Pulisci e ricompila i lavori ... che strano. –

risposta

10

Ottieni le visualizzazioni e imposta gli ascoltatori nel metodo onPostCreate().

+0

Grazie mille per i tuoi post. Non capisco davvero perché ma ora funziona. Ho appena cambiato id-Names sia nel codice java che in xml (da newDeckB a newDeckButton) e ora funziona. Davvero non capisco perché l'ho provato già ieri e non ha risolto il problema. – Neuhier

+1

A volte è necessario "pulire" e ricostruire il progetto per ottenere le resurzioni corrette compilate, è qualcosa di Eclipse. Il metodo onPostCreate() viene eseguito quando il contenuto è completamente caricato. Accetta la risposta, plz =) – manelizzard

+0

Grazie per la spiegazione. – Neuhier

-2

ci sono due eventi che l'App si aspetta, onCreate(), e OnStart()

Che uno si mette questa funzione in, materia.

ho dovuto spostare "findViewById" da onCreate() per onStart()

@Override 
protected void onStart() { 
     // use findViewById() here instead of in onCreate() 
    } 
+1

Includi più informazioni per favore. –

+0

Devi spiegare la tua risposta in modo più chiaro. Altrimenti, non è troppo utile anche se è corretto. – JakeGould

+0

Ci sono due eventi che l'App si aspetta, onCreate() e onStart() in cui si inserisce questa funzione, importa. –

Problemi correlati