2012-04-24 18 views
1

FragmentPagerAdapterを使用してタブ付きインターフェイスを実装しています。私の0番目のフラグメントは、作成時にローダーを作成し、onActivityCreated()でローダーに再接続しようとします。ここではクラスがあります:LoaderCallbacks.onLoadFinished()はFragmentPagerで呼び出されませんでしたか?

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. のAppは、0番目のフラグメントがFragmentPagerAdapterに作成され、開始します。
  2. onActivityCreated()メソッドが呼び出され、最初の実行時にローダーが作成されて開始されます。
  3. ローダーがまだ完了しないうちに、すぐに別のタブに切り替わります。
  4. ローダーが終了したことをログで確認できますが、コールバックではonLoadFinished()コールバックが返されません。これは、FragmentPagerAdapterがどのように動作するかに応じて、フラグメントが何らかの分離状態になっているためです。
  5. 0番目のタブに戻り、onActivityCreated()が呼び出され、initLoader()メソッドが再度呼び出されることがわかります。コールバックはまだ起動しません。
  6. この時点でローダーマネージャーにすべてのローダーを印刷して、ローダーがまだローダーマネージャーに座っていることを確認できます。

私はここで立ち往生しています。ローダーはフラグメントライフサイクルを考慮した開発者が使いやすいように設計されている必要があるため、何か間違っている必要があります。誰でも私がここで間違っていることを指摘できますか?

答えて

0

は、APIのデモや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は、ローダーを含むものです。

2

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

myCallback.onLoadFinished()は、フラグメントが開始されるまで、実際には "myCallback"がローダーに接続されていないため、呼び出されません。

6

おそらくあなたが同じフラグメントの2つのインスタンスを持って、フラグメントを破壊する上でローダーを破壊してみてください。

protected void onDestroy() { 
  if (getSupportLoaderManager().getLoader(0) != null) { 
           getLoaderManager().getLoader(0).abandon(); 
           getSupportLoaderManager().destroyLoader(0); 
  } 
   super.onDestroy(); 
} 
関連する問題