2016-12-27 92 views
1

我在我已在BenefintsFragment增加了一個片段==> BenefitsFragment 一個MainActivity從堆棧中取出片段存在的RelativeLayout在機器人嵌套片段

<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添加到恢復狀態,並使用FragmentManager pop方法從堆棧中刪除:

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

雅我沒有添加到後臺,現在它工作 –

1

使用commitNow()時要小心,你添加的片段將不會被添加到堆棧中。有關更多信息,請參見answerthis blog post

如果你想使用堆棧中,你應該使用commit()addToBackStack()代替commitNow()

爲什麼commitNow()不加入到堆棧中的主要原因是commitNow()將同步執行的交易,如果它會加入到堆棧中如果還有其他待處理的異步事務,則該事務可以打破後臺命令。

+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(); 
     } 
    }); 

希望這會有所幫助。