2013-01-04 21 views
8

Ich verwende eine AsyncTask-Klasse, um Daten aus einer PHP-Datei herunterzuladen. Nach dem Herunterladen möchte ich diese Daten in verschiedene TextViews einfügen, aber ich kann die Methode findViewById nicht verwenden.Kann nicht auf "findViewById" in AsyncTask zugreifen

Das Problem ist, dass ich dies durch separate Klassen tun, und das alles in einem Fragment.

Dies ist mein Code:

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; 
} 

Und wo ich das Problem habe:

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

Ich habe dies versucht:

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

Aber die Arbeit ist nicht zu .

Beachten Sie, dass ich diese AsyncTask von einem Fragment aufrufen. Wie man sehen kann, hatte ich den Zusammenhang von getActivity() an die AsyncTask abgerufen weitergeben müssen:

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; 
} 


} 

Was soll ich tun?

Vielen Dank.

+0

Veröffentlichen Sie Ihren LogCat – Ahmad

Antwort

24

Fahren Sie mit aufgeblasenen Blick auf die AsyncTask wie folgt aus:

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); 
} 

Dann wie so nennen,

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

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

Kontext bezieht sich normalerweise auf die Anwendung oder die Aktivität, die verwendet wird. Ansichten sind UI-Elemente wie TextViews/Schaltflächen und Container (LinearLayout, etc. – petey

+0

Danke für die Antwort, ich bin neu in Android .... so danke für Ihre Hilfe ... –

+0

Großartig! Es funktioniert .... – partho

1

Versuch als nach MyFragmentA Kontext statt getActivity() vorbei:

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

und ändern RecuperarComentarisFoto als

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

Fügen Sie einfach einen zusätzlichen Parameter zu Ihrem AsyncTask mit dem Blick myFragmentView und Ihre Textview auf, dass finden .

@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; 
} 

und verwenden Sie dann nur diese Ansicht ..

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

Sie können myFragmentView global machen Auf diese Weise können Sie von überall auf Ihre Ansichten zugreifen, sogar von Ihren Fragmentmethoden wie onStart.

Verwandte Themen