我正在使用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()!");
}
};
}
以下是情景:
所以我被困在这里,我必须做错事,因为Loader的东西必须设计为易于我们开发人员使用片段生命周期。谁能指出我在这里做错了什么?
谢谢
答案 0 :(得分:6)
可能你有两个相同片段的实例,在destroy fragment上尝试destroy loader:
protected void onDestroy() {
if (getSupportLoaderManager().getLoader(0) != null) {
getLoaderManager().getLoader(0).abandon();
getSupportLoaderManager().destroyLoader(0);
}
super.onDestroy();
}
答案 1 :(得分:2)
不知道你是否解决了问题,但你应该在Fragment.onStart()上调用forceLoad()而不是Fragment.onActivityCreated()。
永远不会调用myCallback.onLoadFinished(),因为在您的片段启动之前,“myCallback”实际上并未附加到加载器。
答案 2 :(得分:0)
请参阅API Demos或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是包含Loader的那个。