4

私の考えは、AsyncTask 内に新しいフラグメントを作成し、onPostExecute で、表示されている進行状況バーのフラグメントと交換することでした。私の問題は、フラグメントがスワップされないため、進行状況バーのフラグメントにとどまることです。これはできませんか?それは悪いアプローチですか?代わりに DetailFragment 内に進行状況バーを表示する必要がありますか? (プログレスバーを含む多くのフラグメントになります)

@Override
protected void onStart() {      
    super.onStart();
    getSupportFragmentManager().beginTransaction()
            .replace(R.id.content_frame, new ProgressBarFragment()).commit();
    TestSwapFragment d = new TestSwapFragment();
    d.execute(data);
}

class TestSwapFragment extends AsyncTask<FragmentData, Void, MyFragment> {

FragmentData data = null;

    @Override
    protected MyFragment doInBackground(FragmentData... params) {

        try {
            Thread.sleep(15000); // Simulate the long running method below
        } catch (InterruptedException e) {                  
            e.printStackTrace();
        }

        this.data = params[0];
        DetailFragment df= new DetailFragment();
        df.ExecuteFragment(this.data); // Long running

        return df;
    }

    @Override
    protected void onPostExecute(MyFragment result) {               
        super.onPostExecute(result);

        if (this.data.Position == FragmentPosition.PaneOne)
                getSupportFragmentManager().beginTransaction()
                .replace(R.id.content_frame, result).commit();
        else
                getSupportFragmentManager().beginTransaction()
                .replace(R.id.content_frame2, result).commit();
    }

}
4

1 に答える 1

2

これがうまくいかない理論的な理由はわかりません。しかし、それは私にとって非常に奇妙なアプローチだと言いました。

AsyncTask.doInBackground()通常、データの作成/ダウンロード/処理に使用され、AyncTask.onPostExecute()は UI の更新に使用されます。ただし、両方の方法で UI パーツを配布しています。

さらに、Fragment は UI クラスであり、これを使用してデータ処理を行い、各クラスの目的を再び混合します。原則として、私のプロジェクトでは、そのようなものに従う傾向があります(いくつかの一般的な名前を示す例ですが、実際のものでは、意味のある名前を使用してください。また、短くするために、いくつかのコンストラクターを無視している可能性があります)

MyActivity.java
public class MyActivity extends Activity{


      private class MyWorker extends AsyncTask<SomeDataObject, Integer, SomeDataListObject>{
            @Override
            protected MyFragment doInBackground(SomeDataObject... params) {
                 // in here we use SomeDataObject to generate the SomeDataListObject
                 return MyDataCruncher.processData(someDataObject);
                 // see it's a static method, process A and generates B, that's all.
                 // but very important that it's its own class, separate from Activity and Fragment
            }

            @Override
            protected void onPostExecute(SomeDataListObject result){
                if(results != null){
                     // Here we create the fragment, pass the data to it and do the transaction
                     getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, MyFrag.newInstance(result)).commit();

                }else{ /* do some error handling or whatever */ }
            }
}

そして、フラグメントで次のことを行います。

public class MyFrag extends Fragment{
    private static String KEY_DATA = "_key_data_"
    public static MyFrag newInstance(SomeDataListObject data){
        MyFrag frag = new MyFrag();
        Bundle b = new Bundle();
        frag.setArguments(b);
        // it's important to make your data parcelable and pass it with a Bundle as part of the fragment life-cycle
        b.putParcelableArrayList(KEY_DATA, data);
        return frag;
    }

    // then inside onCreateView
     SomeDataListObject data = getArguments.getParcelableArray(KEY_DATA);
    // ---

}

それが役に立てば幸い

于 2012-12-30T12:14:47.793 に答える