1

Вот структура моей AppViewPager пробел после слова из списка DrawerLayout

HomeActivity заменяет contentArea либо TransScreen или FlowScreen. Оба являются фрагментами (поддержка v4).

  • HomeActivity (drawerlayout содержащий contentArea frameLayout + ListView меню)
    • TransScreen (фрагмент с ViewPager + ActionBar вкладок)
      • InListFragment (ListFragment)
      • OutListFragment (ListFragment)
    • FlowScreen (фрагмент)

Когда приложение запускается, TransScreen является экраном по умолчанию - я вижу списки - здесь все хорошо. Переключитесь с меню ящика на FlowScreen, это тоже хорошо. Теперь, когда я переключусь на TransScreen, я вижу вкладки, но пустой контент в ViewPager (а не «пустое» сообщение или listView).

Пробовал отладки, на первый рендер TransScreen, я вижу метод GetItem адаптера в ViewPager в (производный от 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 (положение). Однако 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 к вкладкамAdapter внутри фрагмента первого уровня TransScreen. Нет кубиков.


Еще одно обновление:

Таким образом, чтобы исключить возможность того, что я перепутались в TransScreen.Я скачал код для следующего андроида образца http://developer.android.com/samples/SlidingTabsColors/index.html

Я тогда замещенный TransScreen с SlidingTabsColorFragment()

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) 
+0

вот решение -> http://stackoverflow.com/questions/16600156/fragment-in-viewpager-not-restored-after-popbackstack?rq=1 –

ответ

1

Итак, ответ кажется: Не используйте ViewPager с вложенными фрагментами - он не работает.

Итак, я посмотрел приложение, в котором было то, что я хотел. В основном простой NavDrawer, который позволяет вам перейти на разные экраны, один или несколько из которых могут содержать просмотрщик. Поэтому я посмотрел источник Google IO App.

Извлеченные уроки :.

  1. Использование мероприятий для разных экранов - я использовал фрагменты. Когда вы нажмете опцию навигационного ящика, создайте новое действие. Подавлять анимацию по умолчанию + использовать fade in/out для получения менее резкого перехода.
  2. Итак, теперь для экрана у нас есть ViewPager с фрагментами одного уровня. (В отличие от фрагмента, содержащего ViewPager с вкладки дочерних фрагментов)
  3. кажется SlidingTabLayout предпочтительнее ActionBar вкладок (что я использую)

вопрос не решен. С этими изменениями, это достаточно хорошо обход

Смежные вопросы