2012-02-10 14 views
17

Ho una visualizzazione di testo nel mio Lyout e vorrei impostare del testo in questa vista testo. Questo dovrebbe essere fatto in una classe che non è una classe MainActivity.findViewById() non funziona in una classe non MainActivity

Il problema è che ho ottenuto un'eccezione di puntatore nullo.

Ecco il mio codice:

public class UserInformations extends Activity{ 

TextView emailTextView; 
LocalDatabase localdatabase= new LocalDatabase(this); 


    public void getUserInformation() 
    { 
    emailTextView = (TextView) findViewById(R.id.EmailTextView); 
    String email = localdatabase.getUserEmail(); 
    emailTextView.setText(email); 
    } 
} 

Quando sto facendo questo nella classe di attività principale, funziona, ma non funziona non in un'altra classe.

+0

l'emailTextView = (TextView) findViewById (R.id.EmailTextView); –

+0

No, il mio database è in un'altra classe. il valore dell'email è buono, quindi penso che il problema derivi da textView –

risposta

29

Chiamare findViewById() sull'oggetto Activity funziona solo se il layout dell'attività corrente è impostato da setContentView. Se si aggiunge un layout con altri mezzi, è necessario l'oggetto View del layout e chiamare findViewById() su di esso.

View v = inflater.inflate(id_number_of_layout); # such as R.layout.activity_main 
View innerView = v.findViewById(id_number_of_view_inside_v); 

Se il layout si suppone che sia il layout principale dell'attività, quindi fare questo:

public class MyActivity extends Activity{ 
    TextView emailTextView; 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(id_number_of_layout); 
    emailTextView = (TextView) findViewById(R.id.EmailTextView); 
    // ... whatever other set up you need to do ... 
    } 

    public void getUserInformation() { 
    // .... regular code ... 
    } 
} 
+0

Grazie DeeV, ho qualche problema a capire questo codice, mi dispiace. Quindi, nella mia attività principale, stavo già chiamando setcontentview (...) ma ora nella mia seconda classe, come posso trovare il numero ID del mio id_number_of_layout e id_number_of_view_inside_v –

+0

Sai già cosa sono. Nel tuo caso, devi recuperare un'istanza del layout che contiene la vista con l'ID 'R.id.EmailTextView'. In genere, se stai utilizzando un'altra classe al di fuori della classe 'Activity', devi passare la vista tramite il metodo costruttore o setter. Poiché la vista principale è già gonfiata nella tua classe di attività principale, probabilmente vorrai chiamare 'findViewById (R.id.EmailTextView)' in quella classe, quindi passare il riferimento all'oggetto della vista di testo alla tua altra classe. – DeeV

+0

Ok, grazie mille, lo farò in questo modo. –

5

Non hai ancora impostato il contenuto Visualizza?


per fare questo uso qualcosa di simile:

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


    } 


} 
+0

No, come farlo, sto lavorando per la prima volta con la visualizzazione di contenuto. –

+0

Ho notato sopra ^^ – FabianCook

+0

Ho già questo nella mia classe MainActivity. –

4
findViewById(R.id.EmailTextView); 

Si sia

  1. Non impostare il layout Visualizza
  2. hanno alcun View con ID EmailTextView, e quindi findViewById restituisce null. Non devi inserire il tipo, ma l'ID che gli hai assegnato nell'XML.

MODIFICA: sicuramente l'1 in base ai nuovi commenti.

+0

Grazie, ma come vedere il layout della vista? –

3

Quando si chiama si chiama findViewById. Il layout deve essere già successo. È necessario avere già impostato una visualizzazione del contenuto, ecc.

Ci sono modi per aggirare questo problema, come mostrato in altre risposte, ma funzionano fondamentalmente in modo diverso da findViewById e devono essere utilizzati come sostituti solo se si capisce esattamente come lavorano. Molto spesso è molto più efficiente aspettare solo dopo che il layout iniziale si è già verificato.

Problemi correlati