2013-01-04 3 views
8

Sto utilizzando una classe AsyncTask per scaricare dati da un file php. Dopo il download, voglio mettere questi dati, in diverse TextViews, ma non posso usare il metodo findViewById.Impossibile accedere a "findViewById" in AsyncTask

Il problema, è che sto facendo questo da classi separate, e tutto all'interno di un frammento.

Questo è il mio codice:

public class RecuperarComentarisFoto extends AsyncTask<String, String, String>{ 
private Context mContext; 
[...] 
public RecuperarComentarisFoto(Context context){ 
    this.mContext=context; 
} 
@Override 
protected void onPreExecute() { 
    [...] 
} 

@Override 
protected String doInBackground(String... arg0) { 
    params.add(new BasicNameValuePair("pid", "1")); 
    JSONObject json = jsonParser.makeHttpRequest(url_get_comentaris, "GET", params); 
    JSONArray productObj; 
    //HERE I RETRIEVE DATA FROM JSON. ITS WORKING OK. 

    return null; 
} 

E dove ho il problema:

@Override 
protected void onPostExecute(String result) { 
    super.onPostExecute(result); 
    this.pDialog.dismiss(); 
    TextView comentariEditText = (TextView) findViewById(R.id.commentsMostrar); 
} 

Ho provato questo:

 TextView comentariEditText = (TextView) mContext.findViewById(R.id.commentsMostrar); 

Ma non funziona troppo .

Nota che sto chiamando questo AsyncTask da un frammento. Come potete vedere, ho dovuto passare il contesto recuperato da getActivity() per l'AsyncTask:

public class MyFragmentA extends Fragment { 
Context cont; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View myFragmentView = inflater.inflate(R.layout.fragment_a, container, false); 

    cont=getActivity(); 
    new RecuperarComentarisFoto(cont).execute(); 
    return myFragmentView; 
} 


} 

Cosa devo fare?

Grazie.

+0

Pubblica il tuo logCat – Ahmad

risposta

24

Passare il tuo vista gonfiato per l'AsyncTask in questo modo:

public class RecuperarComentarisFoto extends AsyncTask<String, String, String>{ 
private Context mContext; 
private View rootView; 
[...] 
public RecuperarComentarisFoto(Context context, View rootView){ 
    this.mContext=context; 
    this.rootView=rootView; 
} 
@Override 
protected void onPreExecute() { 
    [...] 
} 

@Override 
protected String doInBackground(String... arg0) { 
    params.add(new BasicNameValuePair("pid", "1")); 
    JSONObject json = jsonParser.makeHttpRequest(url_get_comentaris, "GET", params); 
    JSONArray productObj; 
    //HERE I RETRIEVE DATA FROM JSON. ITS WORKING OK. 

    return null; 
} 
@Override 
protected void onPostExecute(String result) { 
    //super.onPostExecute(result); <--GET RID OF THIS (it will screw up on 2.1 devices) 
    this.pDialog.dismiss(); 
    // use rootview to findViewById 
    TextView comentariEditText = (TextView) rootView.findViewById(R.id.commentsMostrar); 
} 

quindi chiamare in questo modo,

View myFragmentView = inflater.inflate(R.layout.fragment_a, container, false); 

cont=getActivity(); 
new RecuperarComentarisFoto(cont, myFragmentView).execute(); 
+2

contesto si riferisce in genere all'applicazione o l'attività utilizzata. Le viste sono elementi dell'interfaccia utente come TextViews/pulsanti e contenitori (LinearLayout, ecc. – petey

+0

grazie per la risposta, sono nuovo in Android .... quindi grazie per l'aiuto ... –

+0

Grande! Funziona .... – partho

1

prova come dopo aver superato MyFragmentA contesto, invece di getActivity():

cont=this; 
new RecuperarComentarisFoto(cont).execute(); 

e cambiare RecuperarComentarisFoto come

public class RecuperarComentarisFoto extends AsyncTask<String, String, String>{ 
public Fragment mContext; 
[...] 
public RecuperarComentarisFoto(Fragment context){ 
    this.mContext=context; 
} 
@Override 
protected void onPostExecute(String result) { 
    super.onPostExecute(result); 
    this.pDialog.dismiss(); 
    TextView comentariEditText = 
        (TextView)mContext.findViewById(R.id.commentsMostrar); 
} 
//...your code.. 
1

Basta aggiungere un parametro supplementare al vostro AsyncTask con la myFragmentView vista e trova il tuo TextView su quel .

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View myFragmentView = inflater.inflate(R.layout.fragment_a, container, false); 

    cont=getActivity(); 
    new RecuperarComentarisFoto(cont, myFragmentView).execute(); 
    return myFragmentView; 
} 

e poi basta usare quella vista ..

TextView comentariEditText = (TextView) mView.findViewById(R.id.commentsMostrar); 
0

Puoi rendere myFragmentView globale in questo modo puoi accedere alle tue visualizzazioni da qualsiasi luogo, anche dai tuoi metodi di frammento come onStart.