这是我的应用程序的结构
HomeActivity用TransScreen或FlowScreen替换contentArea。两者都是碎片(支持v4)。
当应用程序启动时,TransScreen是默认屏幕 - 我看到列表 - 这里都很好。从抽屉菜单切换到FlowScreen,这也很好。现在,当我切换回TransScreen时,我看到了标签但是ViewPager中的空白内容(不是'空'消息或listView)。
尝试调试,在第一次渲染TransScreen时,我看到ViewPager适配器的getItem方法(派生自FragmentStatePagerAdapter)被调用(调用堆栈从ViewPager.populate()开始) 但是当我切换到另一个屏幕并再次返回时,会调用TransScreen :: onCreateView(),但不会触发后续的getItem调用。
这是TransScreen onCreateView的样子:
伪代码 onCreateView()
_tabsPager = new ViewPager(activity); // from getActivity()
_tabsPager.setId(R.id.transactionsTabCarousel);
_tabsPager.setAdapter(_tabsAdapter);
_tabsPager.setOnPageChangeListener(syncSelectedActionBarTabOnPageSelectListener());
ActionBar actionBar = activity.getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
TabListener tabListener = getSyncPagerOnTabSelectListener();
actionBar.addTab(createActionTab(actionBar, tab1Text, tabListener));
actionBar.addTab(createActionTab(actionBar, tab2Text, tabListener));
Log.d(TAG, "onCreate end!");
return _tabsPager;
_tabsAdapter在onCreate()中创建,并在getItem(position)期间在内部Fragment数组中进行查找。但是getItem似乎只是第一次被调用,而不是在我通过drawerLayout - pullout菜单切换到这个屏幕之后。
public TransactionTabsAdapter(FragmentManager fm) {
super(fm);
try {
_fragments = new Fragment[2];
_fragments[0] = new InListFragment();
_fragments[1] = new OutListFragment();
} catch (Exception e) {
Log.e(TAG, "TabsAdapter ctor", e);
}
}
LogCat中没有例外。
尝试将getChildFragmentManager传递给第一级片段TransScreen内的tabsAdapter。没有骰子。
另一个更新:
所以要消除我在TransScreen中搞砸的可能性。我下载了以下android示例http://developer.android.com/samples/SlidingTabsColors/index.html
的代码然后我用SlidingTabsColorFragment()
替换了TransScreenHomeActivity:的onCreate
...
_screens = new Fragment[]{
new SlidingTabsColorsFragment(), //new TransactionsScreen()
new CashFlowScreen() };
setScreen(0);
}
private void setScreen(int position) {
try {
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction()
.replace(R.id.contentArea, _screens[position])
.commit();
_drawerMenu.setItemChecked(position, true);
_drawerLayout.closeDrawer(_drawerMenu);
} catch (Exception e) {
Log.e(TAG, "setScreen via Drawer Menu", e);
}
}
同样的问题可重复 - 并且具有堆栈跟踪
: threadid=1: thread exiting with uncaught exception (group=0x41be52a0)
: FATAL EXCEPTION: main
: java.lang.IllegalStateException: No activity
: at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1091)
: at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086)
: at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1884)
: at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1514)
: at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947)
: at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
: at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
: at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
: at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
: at android.os.Handler.handleCallback(Handler.java:615)
: at android.os.Handler.dispatchMessage(Handler.java:92)
: at android.os.Looper.loop(Looper.java:137)
: at android.app.ActivityThread.main(ActivityThread.java:4921)
: at java.lang.reflect.Method.invokeNative(Native Method)
: at java.lang.reflect.Method.invoke(Method.java:511)
: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
: at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:1)
所以答案似乎是:不要将ViewPager与嵌套片段一起使用 - 它不起作用。
所以我看了一个有我想要的应用程序..基本上是一个简单的NavDrawer,它允许你跳转到不同的屏幕,其中一个或多个可能包含一个viewpager。所以我查看了Google IO App来源。
经验教训:。
问题尚未解决。通过这些更改,它是一个足够好的解决方法