在Tabs android中添加片段的最佳方式是什么?[英] What is the best way to add fragment in the Tabs android

问题描述

我的应用程序有一个有5个标签的底部导航栏. 所以根据这些标签,我有5个碎片 当我单击选项卡时,片段根据该选项卡更改. 我可以使用BegintRansaction()来切换片段.更换... 我不希望每次切换标签时再次被破坏和重新创建片段,所以我的解决方案是如此

//I init 5 fragments
Fragment1 frag1 = new Fragment1();
Fragment2 frag2 = new Fragment2();
Fragment3 frag3 = new Fragment3();
Fragment4 frag4 = new Fragment4();
Fragment5 frag5 = new Fragment5();

//When I click on tab, for example tab1, I hide all fragments except tab1
//hide all fragments
getSupportFragmentManager()
                    .beginTransaction()
                    .hide(fragment1) //Fragment2, 3, 4, 5 as well
                    .commit();

//show fragment 1
getSupportFragmentManager()
                    .beginTransaction()
                    .show(fragment1)
                    .commit();

它很好,但问题有时是2个碎片同时显示(我不知道为什么,因为我隐藏了所有碎片) 达到这一点的任何其他方法吗?切换片段而不破坏它并再次创建它.

在这种情况下,使用ViewPager使用FragmentPagerAdapter适用于您.

然后使用ViewPager#setOffsetPageLimit(5).这将帮助您显示/隐藏您的碎片而不再次重新创建它.

遵循这个教程

让尝试,然后告诉我你的问题是否解决了. ;)

其他推荐答案

添加片段我为我的项目制作这个代码,希望它将是帮助.

 public static void replaceFragment(Fragment fragment, FragmentManager fragmentManager) {
        String backStateName = fragment.getClass().getName();
        String fragmentTag = backStateName;


        Fragment currentFrag = fragmentManager.findFragmentById(R.id.frame_container);
        Log.e("Current Fragment", "" + currentFrag);

//        boolean fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0);
        int countFrag = fragmentManager.getBackStackEntryCount();
        Log.e("Count", "" + countFrag);


        if (currentFrag != null && currentFrag.getClass().getName().equalsIgnoreCase(fragment.getClass().getName())) {
            return;
        }


        FragmentTransaction ft = fragmentManager.beginTransaction();
//        if (!fragmentPopped) {

        ft.replace(R.id.frame_container, fragment);
        ft.addToBackStack(backStateName);
        ft.commit();
//        }

        currentFrag = fragmentManager.findFragmentById(R.id.frame_container);
        Log.e("Current Fragment", "" + currentFrag);


    }

希望这将是帮助您的,并在整个项目中使用此方法来替换片段.

其他推荐答案

您无需隐藏片段只需替换这样的片段:

public void setFragment(Fragment fragmentWhichYouWantToShow) {

        fm = getSupportFragmentManager();
        ft = fm.beginTransaction();
        ft.replace(R.id.container, fragmentWhichYouWantToShow);
        ft.commit();

}

本文地址:https://www.itbaoku.cn/post/978482.html