2013-01-04 17 views
8

Używam klasy AsyncTask do pobierania danych z pliku php. Po pobraniu chcę umieścić te dane w różnych widokach tekstu, ale nie mogę użyć metody findViewById.Brak dostępu do "findViewById" w AsyncTask

Problem polega na tym, że robię to przez oddzielne klasy, a wszystko to w obrębie fragmentu.

To jest mój kod:

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

A gdzie mam problem:

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

Próbowałem to:

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

Ale nie działa zbyt .

Pamiętaj, że nazywam to AsyncTask z fragmentu. Jak widać, musiałem zdać kontekst pobierane przez getActivity() do 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; 
} 


} 

co mam zrobić?

Dziękuję.

+0

Opublikuj kontekst LogCat – Ahmad

Odpowiedz

24

Przełóż zawyżone widok na AsyncTask tak:

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

Następnie zadzwonić jak tak,

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

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

zwykle oznacza aplikację lub używane działanie. Widoki to elementy interfejsu użytkownika, takie jak TextViews/przyciski i kontenery (LinearLayout itp.) – petey

+0

dzięki za odpowiedź, jestem nowy w Androidzie .... dlatego dziękuję za pomoc ... –

+0

Świetnie! Działa .... – partho

1

spróbować, jak po przejściu MyFragmentA kontekst zamiast getActivity():

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

i zmienić RecuperarComentarisFoto jak

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

Wystarczy dodać dodatkowy parametr do AsyncTask z poglądem myFragmentView i znaleźć TextView na ten temat .

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

a potem po prostu użyć tego widoku ..

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

Możesz ustawić swój plik myFragmentView jako globalny w ten sposób możesz uzyskać dostęp do swoich widoków z dowolnego miejsca, nawet z wykorzystaniem metod fragmentacji, takich jak onStart.

Powiązane problemy