2013-07-30 2 views
0

J'ai un MainActivity.class sur lequel je fais setContentView, voici les trois variables que je faisaisandroid: findViewById retourne NULL lorsque les accès d'une autre classe

EditText labelText = (EditText) findViewById(R.id.label_field); 
    EditText phoneText = (EditText) findViewById(R.id.phone_field); 
    Spinner deviceTypeSpinner = (Spinner) findViewById(R.id.device_type_spinner); 
    Button registerButton = (Button) findViewById(R.id.register_button) 

Maintenant, j'ai une classe séparée qui étend une tâche asynchrone, j'essaie de modifier les champs ci-dessus de la tâche asynchrone (classe située dans un autre fichier).

Pour ce faire, je passe le contexte de l'activité à Async tâche et réaliser les étapes ci-dessous

  MainActivity activity = (MainActivity)context; 
      Button buttonRegister =(Button)activity.findViewById(R.id.register_button); 
      EditText labelText = (EditText)activity.findViewById(R.id.label_field); 

      buttonRegister.setEnabled(true); 
      labelText.setFocusable(true); 

mais le buttonRegister renvoie NULL et les accidents app, quelqu'un peut-il me dire où ai-je a mal tourné,

java.lang.NullPointerException 
    at  com.yantranet.minixagent.requests.DeviceCreateRequest$1.onClick(DeviceCreateRequest.java:237) 
    at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:167) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4895) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761) 
    at dalvik.system.NativeStart.main(Native Method) 
+0

est la classe asynctask dans la classe principale ou différente? – KOTIOS

+0

passez-vous le contexte d'activité au constructeur asynctask? – Raghunandan

+0

@ Stacks28: c'est dans une autre classe –

Répondre

2

mais le buttonRegister retourne null et les accidents app, quelqu'un peut-il me dire où ai-je mal tourné,

je ne vois pas où vous appelez la méthode

setContentView(<layout>); 

. Sans cela, il renvoie toujours NPE parce que cette méthode se soucie de l'inicialisation de toutes les instances de l'interface utilisateur dans la disposition spécifiée. Vous devez appeler toujours avant que vous voulez avec des widgets initialiser

findViewById(<id>); 

Depuis que vous appelez dans une autre classe il (classe sait rien de ce que vous avez fait dans d'autres classes) fonctionnent pas. Vous devez:

  • widgets passe via un constructeur
  • changement logique de l'application (le plus probable est pas désigné correctement)
+0

J'ai déjà défini l'affichage du contenu dans l'activité principale. Dois-je à nouveau afficher le contenu de la tâche de synchronisation pour accéder aux champs? –

+1

Vous devez passer des widgets via le constructeur ou faire classe comme classe interne. – Sajmon

+1

J'ai de nouveau défini la vue du contenu de l'asynctask comme vous l'avez dit, et cela fonctionne bien maintenant. Merci une tonne :) –

1

Si vous passez le contexte d'une activité correcte, alors il devrait fonctionner, mais je Je préférerais ne pas passer de contexte à une autre classe car cela n'a rien à voir avec l'activité. Vous pouvez utiliser le design suivant.

  1. enregistrer un écouteur avec classe async
  2. Mettre en œuvre que l'auditeur dans l'activité
  3. Une fois la tâche async complète son travail, il invoquera que l'auditeur
  4. activité va changer l'interface utilisateur ce qu'il veut lors de l'exécution de l'auditeur.
+0

Je suis en train d'appeler une boîte de dialogue d'alerte de l'onPostExecute de la tâche asynchrone et de la boîte de dialogue, j'essaie de mettre à jour l'interface graphique d'activité –

+0

S'il vous plaît envoyer le code complet, je vous voulez voir dans quel contexte passez-vous à une tâche asynchrone et quel contexte utilisez-vous pour mettre à jour l'interface utilisateur? –

1

Vous ne pouvez pas modifier les éléments de disposition dans doInBackgroud().

class MyAsync extends AsyncTask<String, Integer, String>{ 

@Override 
protected void onPreExecute() { 
    // TODO Auto-generated method stub 
    super.onPreExecute(); 
} 
@Override 
protected String doInBackground(String... params) { 
    // TODO Auto-generated method stub 
    return null; 
} 
@Override 
protected void onPostExecute(String result) { 
    // TODO Auto-generated method stub 
    super.onPostExecute(result); 
} 

} 

Vous pouvez utiliser onPreExecute() et onPostExecute(String result) pour modifier des éléments de mise en page.

Maintenant, je vous suggère de surcharger onPostExecute() dans la même classe que vous appelez AsyncClass execute. ex: -

new MyLoadAsync(Inbox.this){ 
      private ProgressDialog pDialog; 
      @Override 
      protected void onPreExecute() { 
       pDialog = new ProgressDialog(Inbox.this);////////// 
       pDialog.setMessage("Loading... Please wait..."); 
       pDialog.setIndeterminate(false); 
       pDialog.setCancelable(false); 
       pDialog.show(); 
       super.onPreExecute(); 
      } 
      @Override 
      protected void onPostExecute(JSONArray result) { 
       pDialog.dismiss(); 
       if(result!=null){ 

       } 
       super.onPostExecute(result); 
      } 


     }.execute("your_param"); 

Donc, ici vous pouvez accéder à vos params de mise en page.

+0

Oui, je le fais depuis onPostExecute –

1

Ce n'est pas un bon moyen de le faire, mais si vous voulez accéder aux widgets d'une autre activité, alors vous devriez faire un setter getter pour cela.

//In you mainActivity 
public Button getRegisterButton() 
{ 
    //Return register button here. 
    return btn; 
} 
public EditText getFieldEditText() 
{ 
     //Return editText here; 
     return eText; 
} 

Code dans lequel vous souhaitez cette vue.

// Dans Activité actuelle.

  MainActivity activity = (MainActivity)context; 
      Button buttonRegister =activity.getRegisterButton(); 
      EditText labelText = activity.getFieldEditText(); 
     if(buttonRegister != null) 
     { 
      buttonRegister.setEnabled(true); 
     } 
     if(labelText != null) 
     { 
      labelText.setFocusable(true); 
     } 

Espérons que cela vous sera utile.

Questions connexes