将碎片带到前面(没有片段娱乐)

我有三个片段F1 F2 F3 F4都可以从侧边栏访问。

所有四个都可以随时以任何顺序调用,

现在我想要,如果F1已经被点击(创建)然后再也没有创建F1,而只是使用片段管理器将片段F1带回到前面。 所有其他片段都一样

到目前为止,我为容器中的每个碎片尝试了这个(碎片活动)

if (fragmentManager.findFragmentByTag("apps")==null) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); Fragment newFragment = new CategoriesFragment(); transaction.replace(R.id.content_frame, newFragment, "apps"); transaction.addToBackStack("apps"); transaction.commit(); } else{ } 

If part确保我没有重新创建片段(如果已经创建了它),但是我应该在else部分写else以便已经创建的片段可以在View Hierarchy中显示出来

请帮助,我坚持了2天。

Solutions Collecting From Web of "将碎片带到前面(没有片段娱乐)"

我将此代码放在活动类中,必须具有ID为R.id.fragment_container的 FrameLayout

 private Fragment1 F1; private Fragment2 F2; private Fragment3 F3; private Fragment4 F4; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); F1 = new Fragment1(); getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F1).commit(); F2 = new Fragment2(); getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F2).commit(); F3 = new Fragment3(); getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F3).commit(); F4 = new Fragment4(); getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F4).commit(); //if needed show F1 getSupportFragmentManager().beginTransaction().show(F1).commit(); } 

并添加此按钮单击:

 public void onBtnClick(View view){ if(mShowF1){ getSupportFragmentManager().beginTransaction().show(F1).commit(); getSupportFragmentManager().beginTransaction().hide(F2).commit(); getSupportFragmentManager().beginTransaction().hide(F3).commit(); getSupportFragmentManager().beginTransaction().hide(F4).commit(); } //... } 

在按钮上单击可以显示您想要的片段并隐藏其他片段。

注意(@ developer1011):用于活动后保存状态调用commitAllowingStateLoss () 。 请小心使用,因为片段不会通过活动恢复来恢复。

注意: MainActivity应为每个片段实现OnFragmentInteractionListener。

 public class MainActivity extends FragmentActivity implements Fragment1.OnFragmentInteractionListener, Fragment2.OnFragmentInteractionListener, Fragment3.OnFragmentInteractionListener, Fragment4.OnFragmentInteractionListener {//.. @Override public void onFragmentInteraction(Uri uri) { // } } 

按标签获取片段并将其替换为容器,

 else{ Fragment existingFragment = (CategoriesFragment)fragmentManager.findFragmentByTag("apps"); transaction.replace(R.id.content_frame,existingFragment, "apps"); transaction.addToBackStack("apps"); transaction.commit(); } 

更新:您可以使用隐藏和显示片段来避免重新创建。而不是使用“transaction.replace()”

 fragmentTransaction.hide(); fragmentTransaction.show(); 

如果你只是想添加一个Fragment而不必担心重新创建它,那么我认为我写的这个方法来添加Fragment会让你工作。

 public static void attachFragment ( int fragmentHolderLayoutId, Fragment fragment, Context context, String tag ) { FragmentManager manager = ( (AppCompatActivity) context ).getSupportFragmentManager (); manager.findFragmentByTag ( tag ); FragmentTransaction ft = manager.beginTransaction (); if (manager.findFragmentByTag ( tag ) == null) { // No fragment in backStack with same tag.. ft.add ( fragmentHolderLayoutId, fragment, tag ); ft.addToBackStack ( tag ); ft.commit (); } else { ft.show ( manager.findFragmentByTag ( tag ) ).commit (); } } 
  1. 为你的片段使用一个简单的ArrayList ,并按顺序添加它们,这样你就知道get(0)将获得F1,get(1)获得F2等。

  2. 将片段创建为单例。 在每个片段中添加一个静态字段和方法:

      private static Fragment mMyInstance = null; public static Fragment newInstance() { if (mMyInstance == null) { mMyInstance = new F1(); } return mMyInstance; } 
  3. 使用静态方法创建Fragments并将它们添加到ArrayList。

  4. 在每个Fragment中添加setRetainInstance(true); 命令到onCreate()方法。

现在,当您使用FragmentManager添加Fragment时, onCreate()将仅在第一次调用时,但每次都会调用onCreateView() 。 您希望每次都对视图进行膨胀并连接小部件,只是因为配置更改而重新创建了Activity。 但您可以检查添加的内容以查看是否是第一次,如果没有,则将小部件重置为之前的状态。 因此,您需要在Fragments中使用成员variables来跟踪其状态。 覆盖onStop()以保存状态,并在连接小部件后在onCreateView()中重新应用它。

然后当按下侧边栏按钮时,您将获得与该按钮对应的片段,删除前一个片段,并使用FragmentManager添加当前片段(或者只使用replace()命令而不是remov()/ add()) 。

如果您使用支持片段,则此静态方法可以完成此任务。

  /** * Takes a Fragment TAG and tries to find the fragment in the manager if it exists and bring it to front. * if not, will return false; * @param manager * @param tag */ public static boolean resurfaceFragment(FragmentManager manager, String tag ){ Fragment fragment = manager.findFragmentByTag(tag); FragmentTransaction transaction = manager.beginTransaction(); if (fragment!=null){ for (int i = 0; i < manager.getFragments().size(); i++) { Fragment f = manager.getFragments().get(i); transaction.hide(f); } transaction.show(fragment).commit(); return true; } return false; }