android - 从 DrawerLayout 列表导航后 ViewPager 空白

标签 android android-fragments android-viewpager drawerlayout

这是我的应用程序的结构

HomeActivity 将 contentArea 替换为 TransScreen 或 FlowScreen。都是Fragments(支持v4)。

  • HomeActivity(包含 contentArea frameLayout + 菜单 ListView 的 drawerlayout)
    • TransScreen(带有 viewPager + 操作栏选项卡的 fragment )
      • InListFragment(列表 fragment )
      • 输出列表 fragment (ListFragment)
    • FlowScreen( fragment )

当应用程序启动时,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 - 拉出菜单切换到这个屏幕之后。

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 传递给第一级 fragment 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)

最佳答案

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

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

经验教训:.

  1. 为不同的屏幕使用 Activity - 我使用的是 fragment 。当您单击抽屉导航选项时,会生成新 Activity 。抑制默认动画 + 使用淡入/淡出以获得不那么刺耳的过渡效果。
  2. 现在对于屏幕,我们有一个带有单级 fragment 的 ViewPager。 (与包含带有选项卡子 fragment 的 viewpager 的 fragment 相反)
  3. SlidingTabLayout 似乎比 ActionBar 选项卡更受欢迎(这是我使用的)

问题没有解决。通过这些更改,这是一个足够好的解决方法

关于android - 从 DrawerLayout 列表导航后 ViewPager 空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26082324/

相关文章:

android - 按钮 onClick 的 NoSuchMethod 异常

android - CursorLeakDetecter : App didnt close database. .. 在一些普通的 Android 代码中。我如何获得控制权

java - MaterialDatePicker android选择指定日期之前而不是指定日期

android - 页面查看器中的 fragment 替换不适用于 API 21

android - 在 Activity fragment 中访问 TextView

android - 使用 FragmentStatePagerAdapater "The specified child already has a parent"错误

java - 如何仅将 GET_CONTENT 用于音频?

Android Fragment和逻辑应用设计

android - Viewpager 和 FragmentPagerAdapter : Page view removal

java - 操作栏选项卡的自定义位置