从DrawerLayout列表导航后,ViewPager为空白

时间:2014-09-28 06:38:06

标签: android android-fragments android-viewpager drawerlayout

这是我的应用程序的结构

HomeActivity用TransScreen或FlowScreen替换contentArea。两者都是碎片(支持v4)。

  • HomeActivity(包含contentArea frameLayout + menuViewView的drawerlayout)
    • TransScreen(带有viewPager +操作栏标签的片段)
      • InListFragment(ListFragment)
      • OutListFragment(ListFragment)
    • FlowScreen(片段)

当应用程序启动时,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()

替换了TransScreen

HomeActivity:的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)

1 个答案:

答案 0 :(得分:1)

所以答案似乎是:不要将ViewPager与嵌套片段一起使用 - 它不起作用。

所以我看了一个有我想要的应用程序..基本上是一个简单的NavDrawer,它允许你跳转到不同的屏幕,其中一个或多个可能包含一个viewpager。所以我查看了Google IO App来源。

经验教训:。

  1. 使用不同屏幕的活动 - 我正在使用片段。单击导航抽屉选项时,会生成新活动。禁止默认动画+使用淡入/淡出来获得较少的震动过渡。
  2. 现在,对于屏幕,我们有一个带有单级片段的ViewPager。 (与包含带有制表符子片段的viewpager的片段相对)
  3. 似乎SlidingTabLayout优于ActionBar标签(我正在使用的)
  4. 问题尚未解决。通过这些更改,它是一个足够好的解决方法