2013-01-04 34 views
8

我正在使用AsyncTask類從php文件下載數據。下載後,我想把這些數據放到不同的TextView中,但是我不能使用findViewById方法。無法在AsyncTask中訪問「findViewById」

問題是,我是通過單獨的類來做這件事,並且它全部在一個片段中。

這是我的代碼:

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

而且在那裏我已經問題:

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

我已經試過這樣:

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

但不工作太。

請注意,我從片段調用此AsyncTask。如您所見,我必須將getActivity()檢索的上下文傳遞給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; 
} 


} 

我該怎麼辦?

謝謝。

+0

發佈您的LogCat – Ahmad

回答

24

您通過膨脹欣賞到的AsyncTask是這樣的:

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

然後調用像這樣,

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

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

上下文通常是指應用程序或正在使用的活動。視圖是UI元素,如TextViews /按鈕和容器(LinearLayout等 – petey

+0

感謝您的答案,我是新的Android ...所以謝謝你的幫助... –

+0

太棒了!它的工作.... – partho

1

嘗試爲傳遞MyFragmentA背景下,而不是getActivity()後:

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

,改變RecuperarComentarisFoto作爲

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

只需添加一個額外的參數,你的AsyncTask的觀點myFragmentView,找到你的上的TextView 。

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

,然後只用這一觀點..

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

你可以使你的myFragmentView全局,這樣你就可以從任何地方訪問你的視圖,甚至可以使用onStart等片段方法。