trna ha minh
trna ha minh

Reputation: 253

What is the best way to add fragment in the Tabs android

My application had a bottom navigation bar which has 5 tabs. So according to these tabs, I have 5 fragments When I click on the tab, the fragment changed according to that tab. I can switch fragment by using the method beginTransaction().replace... I dont want the fragment to be destroyed and recreated again each time I switch tabs, so my solution is sth like this

//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();

It works very well, but the problem is sometimes 2 fragments show at once time (I dont know why because I hide all fragments) Any other way to achieve that? Switch fragment without destroying it and creating it again.

Upvotes: 0

Views: 2063

Answers (4)

Ufkoku
Ufkoku

Reputation: 2638

Try to make it in a singe transaction.

protected void showAsRootFragment(Fragment fragment, @NonNull String tag) {
    FragmentManager supportFragmentManager = getSupportFragmentManager();        
    FragmentTransaction transaction = supportFragmentManager.beginTransaction();
    if (supportFragmentManager.getFragments() != null) {
        for (Fragment attachedFragment : supportFragmentManager.getFragments()) {
            if (attachedFragment != null && !tag.equals(attachedFragment.getTag())) {
                transaction.hide(attachedFragment);
                attachedFragment.setUserVisibleHint(false);
            }
        }
    }

    if (!fragment.isAdded()) {
        transaction.add(R.id.frame_container, fragment, tag);
        fragment.setUserVisibleHint(true);
    } else {
        transaction.show(fragment);
        fragment.setUserVisibleHint(true);
    }

    transaction.commit();
}    

Upvotes: 0

Amit Verma
Amit Verma

Reputation: 391

for adding fragment I make this code for my project, hope it will be help.

 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);


    }

hope this will be help you, and use this method in entire project for replacing fragment.

Upvotes: 2

phatnhse
phatnhse

Reputation: 3920

Using ViewPager with FragmentPagerAdapter suits for you in this case.

Then use ViewPager#setOffsetPageLimit(5). This will help you show/hide your fragments without recreating it again.

Follow this tutorial

Let try it, then tell me if your problem is solved or not. ;)

Upvotes: 1

Deepak Rana
Deepak Rana

Reputation: 549

you don't have to need to hide the fragment just replace the fragment like this method:

public void setFragment(Fragment fragmentWhichYouWantToShow) {

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

}

Upvotes: 0

Related Questions