1

FragmentPagerAdapter を使用して、タブ付きインターフェイスを実装しています。私の 0 番目のフラグメントは、作成時にローダーを作成し、onActivityCreated() でローダーへの再接続を試みます。クラスは次のとおりです。

public class My0thFragment extends Fragment {
    private boolean ranOnce = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true); 
    }

    @Override
    public void onActivityCreated() {
        if (!ranOnce) {
            // if the first time we're being created, do an initial load of data.
            getLoaderManager().initLoader(500, null, mMyCallback).forceLoad();
            ranOnce = true;
        } else {
            // reconnect?
            getLoaderManager().initLoader(500, null, mMyCallback);

            // sanity check.
            printAllLoaders(getLoaderManager());
        }
    }

    private LoaderManager.LoaderCallbacks<Foo> mMyCallback = new LoaderManager.LoaderCallbacks<Foo>() {
        @Override
        public Loader<Foo> onCreateLoader(int arg0, Bundle arg1) {
            return new FooLoader(getActivity(), arg1);
        }

        @Override
        public void onLoadFinished(Loader<Foo> arg0, Foo arg1) {
            Log.e(tag, "onLoadFinished()!");
        }

        @Override
        public void onLoaderReset(Loader<Foo> arg0) {
            Log.e(tag, "onLoaderReset()!");
        }
    };
}

そして、ここにシナリオがあります:

  1. アプリが起動し、FragmentPagerAdapter に 0 番目のフラグメントが作成されます。
  2. onActivityCreated() メソッドが呼び出され、最初の実行時にローダーが作成および開始されます。
  3. ローダーがまだ完了する前に、すぐに別のタブに切り替えます。
  4. ローダが終了したことをログで確認できますが、私のコールバックは onLoadFinished() コールバックを取得しません。これは、FragmentPagerAdapter の動作に応じて、フラグメントがある種の切り離された状態にあるためだと思います。
  5. 0 番目のタブに戻ると、onActivityCreated() が呼び出され、initLoader() メソッドが再度呼び出されます。コールバックはまだ起動しません。
  6. この時点で、ローダー マネージャー内のすべてのローダーを出力でき、ローダーがまだローダー マネージャー内にあることを確認できます。

だから私はここで立ち往生しています.ローダーのものは、フラグメントのライフサイクルを念頭に置いて開発者が簡単に使用できるように設計されている必要があるため、何か間違ったことをしているに違いありません. ここで私が間違っていることを誰かが指摘できますか?

ありがとうございました

4

3 に答える 3

6

おそらく、同じフラグメントのインスタンスが2つあるので、destroyfragmentでdestroyloaderを試してください。

protected void onDestroy() {
   if (getSupportLoaderManager().getLoader(0) != null) {
            getLoaderManager().getLoader(0).abandon();
            getSupportLoaderManager().destroyLoader(0);
    }
    super.onDestroy();
}
于 2012-10-13T08:02:42.980 に答える
2

問題が解決したかどうかはわかりませんが、Fragment.onActivityCreated() の代わりに Fragment.onStart() で forceLoad() を呼び出す必要があります。

myCallback.onLoadFinished() が呼び出されることはありません。これは、フラグメントが開始されるまで「myCallback」が実際にはローダーにアタッチされていないためです。

于 2012-08-28T17:43:01.210 に答える
0

APIDemosまたはSupport4DemosのサンプルコードファイルFragmentTabsPager.javaを参照してください。これは、同じフラグメントのセットを制御するViewPagerとTabHostを提供します。私はあなたが説明するケースを正確にカバーするためにそれをハックしました。(直接私に連絡しましたか?)注意すべき主なことは、サンプルアプリはViewPagerのフラグメントを切り離さないということです。

これが私がそれをハックした部分です:

    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mTabHost = (TabHost)findViewById(android.R.id.tabhost);
    mTabHost.setup();

    mViewPager = (ViewPager)findViewById(R.id.pager);

    mTabsAdapter = new TabsAdapter(this, mTabHost, mViewPager);

    mTabsAdapter.addTab(mTabHost.newTabSpec("fraga").setIndicator("Fragment A"),
            FragmentA.class, null);
    mTabsAdapter.addTab(mTabHost.newTabSpec("fragb").setIndicator("Fragment B"),
            FragmentB.class, null);

    if (savedInstanceState != null) {
        mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
    }

}

フラグメントAは、ローダーを含むフラグメントです。

于 2012-05-09T09:13:11.320 に答える