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

时间:2013-12-23 05:37:02

标签: android android-fragments android-fragmentactivity

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

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

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

到目前为止我为我的容器中的每个片段尝试了此操作(FRAGMENT ACTIVITY)

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部分确保我没有重新创建片段(如果已经创建了它),但我应该在else部分写什么,以便已创建的片段可以在视图中显示在前面层次结构

请帮忙,我坚持了2天。

5 个答案:

答案 0 :(得分:11)

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

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) {
        //
    }
}

答案 1 :(得分:6)

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

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

更新: 你可以使用hide和show片段来避免娱乐。而不是使用“transaction.replace()”

fragmentTransaction.hide(<oldFragment>);
fragmentTransaction.show(<newFragment>);

答案 2 :(得分:2)

如果您只是尝试添加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 ();
    }
}

答案 3 :(得分:1)

  1. 为你的片段使用一个简单的ArrayList<Fragment>,并按顺序添加它们,这样你就知道get(0)会获得F1,get(1)会获得F2等等。

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

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

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

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

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

答案 4 :(得分:0)

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

    /**
 * 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;
}