vicolored
vicolored

Reputation: 835

Keep Fragments alive on Bottom Bar

I'm trying to implement the new design pattern on android with the BottomBar and I'm using a library for that.

Is there a way I can keep the fragment alive ( maybe like ViewPager does? ) so when user changes Tabs and goes to one he already has visited I don't have to recreate the fragment again ?

Upvotes: 0

Views: 502

Answers (1)

jlively
jlively

Reputation: 743

This is what I've done. It's not perfect and it can be further improved. I've included comments as to what does what.

    public class MainHolderFragment extends BaseFragment {

    private static final String ARG_PARAM1 = "param1";

    FragmentMainHolderBinding mBinder;
    FragmentManager mFragmentManager;
    Fragment mFragment;
    Fragment homeFragment = HomeFragment.newInstance();
    Fragment searchFragment = SearchFragment.newInstance();
    Fragment addFragment = AddFragment.newInstance();
    Fragment activityFragment = ActivityFragment.newInstance();
    Fragment profileFragment = ProfileFragment.newInstance();

    public MainHolderFragment() {

    }

    public static MainHolderFragment newInstance() {
        MainHolderFragment fragment = new MainHolderFragment();
        Bundle args = new Bundle();
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mBinder = DataBindingUtil.inflate(inflater, R.layout.fragment_main_holder, container, false);
        mFragmentManager = getChildFragmentManager();
        createFragments();
        adjustTabs();
        setUIListeners();
        return mBinder.getRoot();
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
    }

    private void setUIListeners() {
        mBinder.bottomBar.setOnTabSelectListener(new OnTabSelectListener() {
            @Override
            public void onTabSelected(@IdRes int tabId) {
                switch (tabId) {
                    case R.id.tab_home:
                        hideShowFragment(mFragment, homeFragment);
                        mFragment = homeFragment;
                        break;
                    case R.id.tab_search:
                        hideShowFragment(mFragment, searchFragment);
                        mFragment = searchFragment;
                        break;
                    case R.id.tab_add:
                        hideShowFragment(mFragment, addFragment);
                        mFragment = addFragment;
                        break;
                    case R.id.tab_activity:
                        hideShowFragment(mFragment, activityFragment);
                        mFragment = activityFragment;
                        break;
                    case R.id.tab_profile:
                        hideShowFragment(mFragment, profileFragment);
                        mFragment = profileFragment;
                        break;
                }
            }
        });
    }

    //Method to add and hide all of the fragments you need to. In my case I hide 4 fragments, while 1 is visible, that is the first one.
    private void addHideFragment(Fragment fragment) {
        mFragmentManager.beginTransaction().add(R.id.frame_container, fragment).hide(fragment).commit();
    }

    //Method to hide and show the fragment you need. It is called in the BottomBar click listener.
    private void hideShowFragment(Fragment hide, Fragment show) {
        mFragmentManager.beginTransaction().hide(hide).show(show).commit();
    }

    //Add all the fragments that need to be added and hidden. Also, add the one that is supposed to be the starting one, that one is not hidden.
    private void createFragments() {
        addHideFragment(searchFragment);
        addHideFragment(addFragment);
        addHideFragment(activityFragment);
        addHideFragment(profileFragment);
        mFragmentManager.beginTransaction().add(R.id.frame_container, homeFragment).commit();
        mFragment = homeFragment;
    }

    //I wanted to remove the titles and lower the icons a little bit.
    private void adjustTabs() {
        mBinder.bottomBar.getTabWithId(R.id.tab_home).setPadding(0, 30, 0, 0);
        mBinder.bottomBar.getTabWithId(R.id.tab_search).setPadding(0, 30, 0, 0);
        mBinder.bottomBar.getTabWithId(R.id.tab_add).setPadding(0, 30, 0, 0);
        mBinder.bottomBar.getTabWithId(R.id.tab_activity).setPadding(0, 30, 0, 0);
        mBinder.bottomBar.getTabWithId(R.id.tab_profile).setPadding(0, 30, 0, 0);
    }
}

Upvotes: 1

Related Questions