2015-02-10 3 views
0

Я работаю над приложением, в котором у меня есть боковое меню. Когда каждый элемент кликается, фрагменты заменяются новыми.Замените фрагмент на Android, очистив существующий фрагмент

У меня есть метод для этой замены фрагментов. Но фрагменты перекрываются вместо замены. Старый фрагмент лежит в фоновом режиме, а новые - поверх старых.

Это мой метод замены фрагментов.

private void changeFragment(Fragment targetFragment){ 

    resideMenu.clearIgnoredViewList(); 
    getSupportFragmentManager() 
      .beginTransaction() 
      .replace(R.id.main_fragment, targetFragment, "fragment") 
      .setTransitionStyle(FragmentTransaction.TRANSIT_FRAGMENT_FADE) 
      .commit(); 

} 

Как очистить старый фрагмент до размещения нового?

Edit:

private void changeFragment(Fragment targetFragment){ 

    resideMenu.clearIgnoredViewList(); 
    FragmentTransaction ft = (FragmentTransaction) getSupportFragmentManager().beginTransaction(); 
    Fragment prev = (Fragment) getSupportFragmentManager().findFragmentByTag("fragment"); 
    if (prev != null) { 
     ft.remove(prev); 
    } 
    ft.addToBackStack(null); 
    ft.commit(); 

    getSupportFragmentManager() 
      .beginTransaction() 

      .replace(R.id.main_fragment, targetFragment, "fragment") 
      .setTransitionStyle(FragmentTransaction.TRANSIT_FRAGMENT_FADE) 
      .addToBackStack(null) 
      .commit(); 



} 
+0

Это потому, что фон для фрагментов прозрачны, так что покажет вам, как перекрывающиеся фрагменты. Поэтому избегайте этого, вам нужно установить фоновый цвет или фоновое изображение для определенного фрагмента в вашем XML-файле. – Piyush

+0

Не о цвете фона. У меня есть веб-просмотр, в котором есть несколько видеороликов youtube, которые воспроизводятся, даже если я изменяю фрагмент. Он играет в фоновом режиме, который противоречит правилам YouTube. Мне нужно как-то его очистить. – CuckooMarianne

+0

Ваш код теперь удаляет фрагмент, а затем пытается заменить фрагмент. Я думаю, что второй op должен быть .new not .replace. –

ответ

0

пытаются использовать этот код. Просто удалите предыдущий фрагмент ..: D

 @Override 
     public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
      // TODO Auto-generated method stub 

      if(fragment instanceof MessageInbox){ 

       PRODUCT_FLAG=0; 
      } 
      ft.remove(fragment); 
     } 
0

Я всегда даю фрагмент тегу при его создании. Его гораздо легче найти потом. Затем вы можете использовать такой код:

// DialogFragment.show() will take care of adding the fragment 
// in a transaction. We also want to remove any currently showing 
// dialog, so make our own transaction and take care of that here. 
    FragmentTransaction ft = getFragmentManager().beginTransaction(); 
    Fragment prev = getFragmentManager().findFragmentByTag("dialog"); 
      if (prev != null) { 
       ft.remove(prev); 
      } 
      ft.addToBackStack(null); 
      ft.commit(); 

     // Create and show the dialog. 
DialogFragment newFragment = new GrowLogDialogFragment(); 
newFragment.setTargetFragment(this, 1); 
newFragment.show(getFragmentManager().beginTransaction(), "dialog"); 
+0

См. Отредактированный вопрос. Я изменил свой метод на это. Не работает :( – CuckooMarianne

0
FragmentTransaction ft = getFragmentManager() 
            .beginTransaction(); 
ft.replace(R.id.main_fragment, targetFragment, "fragment"); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
ft.addToBackStack(null);// this line do that 
ft.commit(); 
+0

это не работает :( – CuckooMarianne

0

добавить это на onpause или ondetach

@Override 
public void onPause() { 
    // TODO Auto-generated method stub 
    try{ 

     if (fragment != null) { 
       FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction(); 
       ft.remove(fragment); 
       ft.commit(); 
     } 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
     Thread.interrupted(); 
    super.onPause(); 
} 

}

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