12

AsyncTaskクラスを使用してphpファイルからデータをダウンロードしています。ダウンロードした後、このデータを別のTextViewに配置したいのですが、メソッド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;
}


}

私は何をすべきか?

ありがとうございました。

4

7 に答える 7

28

膨らんだビューを次のように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();
于 2013-01-04T20:19:21.350 に答える
3

これを試してみて((Activity)context)ください...

TextView comentariEditText = 
(TextView) ((Activity)context).findViewById(R.id.commentsMostrar);
于 2018-05-19T15:05:31.260 に答える
3

AsyncTaskをアクティビティから独立させます

仮に

  • あなたAsyncTaskは別のJavaクラス(アクティビティ外)Activityであり、それでもから の任意のビュー要素にアクセスしたいAsyncTask
  • AsyncTaskコードを変更せずに、他のアクティビティで再利用したいAsyncTask

答えはです。インターフェイスを使用する

アドバンテージ?
インターフェースは物事を独立させます(緩く結合されます)

次の手順に従うことができます。

1)インターフェースを作成する

public interface AsyncTaskListener{

   public void giveProgress(int progress);

}

2)AsyncTaskでリスナーを使用する

 DownloadSongTask extends AsyncTask<String,Integer,Void>{

    private AsyncTaskListener listener;

    public DownloadSongTask(Context context)
    {
        listener= (AsyncTaskListener)context;    // Typecast 
    }

    @Override
    public void doInbackGround(String... params)
    {
         // Download code
         int downloadPerc = // calculate that
         publish(downloadPerc);   
    }

    @Override
    public void onProgressUpdate(Integer... params)
    {
         listener.giveProgress(params[0]);  // Use it 
    }

}

3)ActivityandOverrideメソッドでインターフェースを実装します

 public class YourActivity extends AppcompatActivity implements AsyncTaskListener{

    private TextView textView;

    // Activity code //
    new  DownloadSongTask(this).execute("Paradise.mp3");  // this is how you start Task

    @Override 
    public void giveProgress(int progress){
       textView.setText(progress+"");      
    }

}

未来

他のアクティビティでAsyncTaskを使用する必要があるまで、コードの美しさに気付くことはありません。将来、スピナーの進行状況を示すその他のアクティビティでこれ
を使用したいとします。 どのように使用しますか? 単純!インターフェイスを実装し、メソッドをオーバーライドします。AsyncTask

public class YourActivity extends AppcompatActivity implements AsyncTaskListener{

     private Spinner spinner;

     // Activity code //
     new  DownloadSongTask(this).execute("Paradise.mp3");  // this is how you start Task

    @Override 
    public void giveProgress(int progress){
       // Your Spinner code       
    }

}
于 2019-01-25T07:40:04.813 に答える
2

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..
于 2013-01-04T20:16:34.530 に答える
1

ビューmyFragmentViewを使用してAsyncTaskにパラメーターを追加し、その上でテキストビューを見つけるだけです。

@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);
于 2013-01-04T20:19:05.390 に答える
0

グローバルにすることができますmyFragmentView。このようにして、のようなフラグメントメソッドからでもどこからでもビューにアクセスできますonStart()

于 2018-02-24T07:48:33.013 に答える
0

を使用して受け入れられた答えRecuperarComentarisFoto(Context context, View rootView)は私にメッセージを与えます:

java\MyFragmentA.java:64: error: constructor RecuperarComentarisFoto in class RecuperarComentarisFoto cannot be applied to given types;
                new RecuperarComentarisFoto(cont, myFragmentView).execute();
                ^
  required: no arguments
  found: MyFragmentA,View
  reason: actual and formal argument lists differ in length

結果が上記の提案と異なる理由はわかりません。APIバージョン24を使用しました。

したがって、 :initialize()内で追加のメソッドを使用します。AsyncTask

public class RecuperarComentarisFoto extends AsyncTask<String, String, String>{
    private Context mContext;
    private View rootView;
    ...
    public initialize(Context context, View rootView){
        this.mContext=context;
        this.rootView=rootView;
    }
    ...
}

そして、呼び出し元のMyFragmentAクラスの内部:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ...
        View myFragmentView = inflater.inflate(R.layout.fragment_a, container, false);
        cont=getActivity();

        RecuperarComentarisFoto rcf = new RecuperarComentarisFoto();
        rcf.initialize(cont, myFragmentViewt);
        rcf.execute(this);
        ...
    }
于 2020-04-19T08:29:46.610 に答える