Reputation: 835
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
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