2016-12-27 2 views
1

у меня есть MainActivity, в котором я добавил фрагмент ==> BenefitsFragment в BenefintsFragment есть RelativeLayoutУдалить фрагмент из backstack во вложенных фрагментов андроида

<RelativeLayout 
     android:visibility="gone" 
     android:background="@android:color/white" 
     android:id="@+id/benefitContainer" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 


    </RelativeLayout> 

Я добавляю еще один фрагмент, как

browseBtn.setOnClickListener(new View.OnClickListener() 
      { 
       @Override 
       public void onClick(View v) 
       { 
        RelativeLayout mLayout = (RelativeLayout) view.findViewById(R.id.benefitContainer); 
        mLayout.setVisibility(View.VISIBLE); 
        getChildFragmentManager().beginTransaction() 
          .add(R.id.benefitContainer, new ConfirmPinFragment()).commitNow(); 
       } 
      }); 

в моем новом ConfirmPinFragment Я пытаюсь вернуться к старому BenefitsFragment, как

backBtn.setOnClickListener(new View.OnClickListener() 
      { 
       @Override 
       public void onClick(View v) 
       { 
        getChildFragmentManager().popBackStack(); 
       } 
      }); 

Однако это popBackStack не работает, если я пытаюсь удалить с помощью

 getChildFragmentManager().beginTransaction().remove(ConfirmPinFragment.this).commitNow(); 

Это происшествиям говоря

java.lang.IllegalStateException: FragmentManager is already executing transactions 

ответ

1

Вы добавляете к задней состояния с FragmentTransaction и удалить из backstack с использованием методов поп-FragmentManager:

FragmentManager manager = getActivity().getSupportFragmentManager(); 
FragmentTransaction trans = manager.beginTransaction(); 
trans.remove(myFrag); 
trans.commit(); 
manager.popBackStack(); 
+0

ya Я не добавлял в backstack, теперь он работает –

1

Будьте осторожны при использовании commitNow(), фрагмент, который вы добавляете, не будут добавлены в backstack , См. Это answer и this blog post для получения дополнительной информации.

Если вы хотите использовать backstack вы должны использовать commit() с addToBackStack() вместо commitNow()

Главной причиной, почему commitNow() не добавляя в backstack является commitNow() будет выполнять транзакции синхронно, если он будет добавлен в backstack транзакция может сломать заказ backstack, если есть еще ожидающие асинхронные транзакции.

+0

Я пробовал как фиксацию, так и commitNow ничего не работает –

+0

Вам нужно вызвать addToBackStack() тоже –

1

Есть две вещи, которые нужно сделать для этого, чтобы работать. Но в первую очередь нет необходимости в commitNow(). Первое, что вам нужно сделать, это добавить фрагмент, который вы хотите, чтобы вернуться в задний стек во время операции:

browseBtn.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      RelativeLayout mLayout = (RelativeLayout) view.findViewById(R.id.benefitContainer); 
      mLayout.setVisibility(View.VISIBLE); 
      getChildFragmentManager().beginTransaction() 
        .add(R.id.benefitContainer, new ConfirmPinFragment()) 
        .addToBackStack("benefits fragment").commit(); 
     } 
    }); 

и когда вы возвращаетесь использовать getFragmentManager() вместо getChildFragmentManager(), потому что вы на самом деле хотите фрагмент менеджер, который содержит этот фрагмент. Менеджер дочерних фрагментов - это менеджер, который управляет фрагментами внутри этого фрагмента.

backBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      getFragmentManager().popBackStack(); 
     } 
    }); 

Надеюсь, это поможет.

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