Andrew Edwards Andrew Edwards - 3 months ago 25
Android Question

Disable Android Fragment reloading with BottomBar and fragment container

Ok so i'm building an android app that uses this library for a bottom navigation and i'm using a base Activity to hold it along with a Framelayout to manage my fragments for loading/replacing etc.

What works:
tapping on a bottom bar icon loads the fragment it corresponds to and that works perfectly.

My problem:
If i tap on the first tab and then the second tab and then the first tab AGAIN, the entire fragment reloads from scratch.

I don't want this behavior. Anyone have any good tips on how to retain the state of a fragment while ALSO using the bottom bar library.

I achieved something similar with a pagerview in a previous app (the previous app did not use a bottom bar for navigation) but I'm not sure how to use a pager view with ONE base activity that holds the Framelayout for replacing the fragments or if that is even the best solution.

I like the solution i have so far except that the fragments reload from scratch each time they replace the previous. If anyone has any help or suggestions that can help me out it would be greatly appreciated.

Answer

Alright i seemed to figure out a work around for the time being. It keeps the fragment state after switching tabs so I'm satisfied.

In the base activity class that hosts the fragment container i have the following

public class BaseActivity extends AppCompatActivity
{
    AFragment AFragment = new AFragment();
    BFragment BFragment = new BFragment();

    Fragment currentFragment;

    Boolean aIsActive = false;
    Boolean bIsActive = false;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);

        BottomBar bottomBar = BottomBar.attach(this, savedInstanceState);

        bottomBar.setItems(
                new BottomBarTab(null,"A"),
                new BottomBarTab(null,"B")
        );

        bottomBar.setDefaultTabPosition(0);

        bottomBar.setOnTabClickListener(new OnTabClickListener()
        {
            @Override
            public void onTabSelected(int position)
            {
                if (position == 0)
                {
                    if(!aIsActive)
                    {
                        getSupportFragmentManager().beginTransaction().add(R.id.fragmentContainer,AFragment).commit();
                        aIsActive = true;
                    }
                    else
                    {
                        getSupportFragmentManager().beginTransaction().hide(currentFragment).show(AFragment).commit();
                    }

                    currentFragment = AFragment;
                }
                else if(position == 1)
                {
                    if(!bIsActive)
                    {
                        getSupportFragmentManager().beginTransaction().add(R.id.fragmentContainer,BFragment).commit();
                        bIsActive = true;
                    }
                    else
                    {
                        getSupportFragmentManager().beginTransaction().hide(currentFragment).show(BFragment).commit();
                    }

                    currentFragment = BFragment;
                }
            }

            @Override
            public void onTabReSelected(int position) {

            }
        });

    }

}

And loe and behold it works as expected without refreshing the fragments :) any suggestions or feedback please let me know and feel free to comment.

Comments