2014-11-25 7 views
2

У меня есть фрагмент внутри фрагмента. Эта настройка работает нормально, пока вы не повернете устройство. После поворота устройства внутренний фрагмент больше не отображается.Фрагмент Transaction show() не показывает фрагмент во второй раз

Я вызываю метод .show(), и у меня есть несколько операторов журналов для отображения того, что происходит, и фрагмент просто не появляется после вращения.

Любая идея о том, что я делаю неправильно?

Вот мой код. Вопрос может быть найден в частном методе displayTab():

public static class MyTabsListener<T extends Fragment> implements ActionBar.TabListener 
{ 
    private final Activity mActivity; 
    private final String mTag; 
    private final Class<T> mClass; 
    private final Bundle mArgs; 
    private Fragment mFragment; 
    private FragmentManager fm; 
    private Fragment fragmentJobListDetails; 
    private Fragment fragmentTrends; 

    public MyTabsListener(Activity activity, String tag, Class<T> clz, FragmentManager fragmentManager) 
    { 
     this(activity, tag, clz, null,fragmentManager); 
    } 

    public MyTabsListener(Activity activity, String tag, Class<T> clz, Bundle args, FragmentManager fragmentManager) 
    { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
     mArgs = args; 
     fm = fragmentManager; 


     // Check to see if we already have a fragment for this tab, probably 
     // from a previously saved state. If so, deactivate it, because our 
     // initial state is that a tab isn't shown. 
     mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag); 
     if (mFragment != null && !mFragment.isDetached()) 
     { 
      FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction(); 
      ft.hide(mFragment); 
      ft.commit(); 
     } 
    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) 
    { 
     displayTab(tab, ft);  
    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) 
    { 
     if (mFragment != null) 
     { 
      ft.hide(mFragment); 
      //ft.remove(mFragment); 

     }   
    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) 
    { 
     displayTab(tab, ft); 
    } 

    private void displayTab(Tab tab, FragmentTransaction ft) 
    { 
     fragmentJobListDetails = mActivity.getFragmentManager().findFragmentByTag("jobDetails"); 
     fragmentTrends = mActivity.getFragmentManager().findFragmentByTag("trends"); 

     if (fragmentJobListDetails != null && !fragmentJobListDetails.isDetached()) 
     { 
      ft.hide(fragmentJobListDetails); 
     } 

     if (mFragment == null) 
     { 
      mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs); 
      ft.add(android.R.id.content, mFragment, mTag); 
     } 
     else 
     { 
      if (mFragment == fragmentTrends) 
      { 
       System.out.println("fragments are equal"); 
       System.out.println("equal. Fragment added? = " + mFragment.isAdded()); 
       System.out.println("equal. Fragment detached? = " + mFragment.isDetached()); 
       System.out.println("equal. Fragment visible? = " + mFragment.isVisible()); 

       ft.show(fragmentTrends); 

       System.out.println("equal. Fragment added? = " + mFragment.isAdded()); 
       System.out.println("equal. Fragment detached? = " + mFragment.isDetached()); 
       System.out.println("equal. Fragment visible? = " + mFragment.isVisible()); 

      } 

      ft.show(mFragment); 
     } 
    } 
}// end MyTabsListener 

А вот выход из моих журналов, после вращения:

11-25 09:17:24.895: I/System.out(14605): mFragment = TrendsPagerHolder{427a94a8 #1 id=0x1020002 trends} 
11-25 09:17:24.895: I/System.out(14605): fragments are equal 
11-25 09:17:24.895: I/System.out(14605): equal. Fragment added? = true 
11-25 09:17:24.895: I/System.out(14605): equal. Fragment detached? = false 
11-25 09:17:24.895: I/System.out(14605): equal. Fragment visible? = false 
11-25 09:17:24.895: I/System.out(14605): equal. Fragment added? = true 
11-25 09:17:24.895: I/System.out(14605): equal. Fragment detached? = false 
11-25 09:17:24.895: I/System.out(14605): equal. Fragment visible? = false 

Спасибо!

+0

При повороте устройства активность перезапускается. Это означает, что ваша функция onCreate вызывается снова! – SeahawksRdaBest

+0

Да, но что это должно сделать? все остальные фрагменты, перечисленные на других вкладках, отображаются, кроме этого – TooManyEduardos

+0

вам нужно устройство, чтобы иметь возможность изменить ориентацию? – SeahawksRdaBest

ответ

-1

Вам необходимо переопределить выполнение изменений конфигурации по умолчанию. Вы можете сделать это, используя атрибут configChanges тега активности в AndroidManifest. Узнайте больше об этом here.

+0

Не используйте configChanges. Читайте здесь: https://speakerdeck.com/cyrilmottier/deep-dive-into-android-state-restoration – EGHDK

+0

Почему бы и нет? небольшое объяснение было бы хорошим – SeahawksRdaBest

+0

@EGHDK, любое предложение о том, что я должен делать тогда? – TooManyEduardos

0

Я не уверен, что это неправильно с всей операцией, но я использую следующие строки и он всегда работает:

MyDialogFragment dialogFragment = new MyDialogFragment(data); 
dialogFragment.show(getFragmentManager(), key); 

Обратите внимание, что MyDialogFragment имеет два конструктора считать деятельности данных других по умолчанию (empty)

Использование saveState и restoreState позволяет сохранять состояние диалога.

Я надеюсь, что это сработает и для вас.

+0

как бы вы сохранили его в комплекте? – TooManyEduardos

+0

не уверен, что вы имеете в виду ... создайте фрагмент с объектом данных, если вам нужно сохранить состояние, а затем переопределить обратный вызов savestate, вы получите конструктор по умолчанию, поэтому восстановление (создание экземпляра через отражение os), диалог будет быть успешным, в одном из обратных вызовов, который поставляется с сохраненным пакетом состояния, вы можете его восстановить ... Я думаю, что это onViewCreated – TacB0sS

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