BottomBarNavigation code to retain fragment state
package com.ouida.app.ui.home;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.design.widget.CoordinatorLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.view.MenuItem;
import android.view.View;
import android.widget.FrameLayout;
import com.ouida.app.R;
import com.ouida.app.ui.base.BaseActivity;
import com.ouida.app.ui.book_club.BookClubFragment;
import com.ouida.app.ui.my.MyBooksFragment;
import com.ouida.app.ui.profile.ProfileFragment;
import com.ouida.app.ui.rewards.RewardsFragment;
import com.ouida.app.ui.store.StoreFragment;
import com.ouida.app.utils.others.BottomNavigationViewBehavior;
import javax.inject.Inject;
import butterknife.BindView;
import butterknife.ButterKnife;
public class DashboardActivity extends BaseActivity implements DashboardMvpView,
BottomNavigationView.OnNavigationItemSelectedListener {
public static final String SELECTED_ITEM = "arg_selected_item";
private static String MY_BOOKS = "my books";
private static String PROFILE = "profile";
private static String BOOK_CLUB = "book club";
private static String STORE = "store";
private static String REWARDS = "rewards";
Fragment myBooksFragment;
Fragment storeFragment;
Fragment bookClubFragment;
Fragment rewardsFragment;
Fragment profileFragment;
@BindView(R.id.navigation)
BottomNavigationView mBottomNavigationView;
@BindView(R.id.container)
FrameLayout frameLayout;
@Inject
DashboardMvpContract<DashboardMvpView> mPresenter;
FragmentManager mFragmentManager = getSupportFragmentManager();
Fragment mFragment;
private int mSelectedItem = 0;
@NonNull
public static Intent getStartIntent(Context context) {
return new Intent(context, DashboardActivity.class);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dashboard);
getActivityComponent().inject(this);
setUnBinder(ButterKnife.bind(this));
mPresenter.onAttach(this);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
default:
break;
}
return false;
}
@Override
protected void setUp() {
mPresenter.onViewInitialized();
myBooksFragment = MyBooksFragment.newInstance();
storeFragment = StoreFragment.newInstance();
bookClubFragment = BookClubFragment.newInstance();
rewardsFragment = RewardsFragment.newInstance();
profileFragment = ProfileFragment.newInstance();
createFragments();
mBottomNavigationView.setOnNavigationItemSelectedListener(this);
mSelectedItem = getIntent().getIntExtra(SELECTED_ITEM, 0);
MenuItem homeItem = mBottomNavigationView.getMenu().getItem(mSelectedItem);
selectFragment(homeItem);
mBottomNavigationView.setSelectedItemId(mSelectedItem);
CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) mBottomNavigationView.getLayoutParams();
layoutParams.setBehavior(new BottomNavigationViewBehavior());
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
return selectFragment(item);
}
@Override
public void onBackPressed() {
MenuItem homeItem = mBottomNavigationView.getMenu().getItem(0);
if (mSelectedItem != homeItem.getItemId()) {
selectFragment(homeItem);
mBottomNavigationView.setSelectedItemId(0);
} else {
super.onBackPressed();
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt(SELECTED_ITEM, mSelectedItem);
super.onSaveInstanceState(outState);
}
//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.container, fragment).hide(fragment).commit();
}
//Method to hide and show the fragment you need. It is called in the BottomBar click listener.
private Fragment hideShowFragment(Fragment hide, Fragment show) {
mFragmentManager.beginTransaction().hide(hide).show(show).commit();
return show;
}
//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(bookClubFragment);
addHideFragment(rewardsFragment);
addHideFragment(storeFragment);
addHideFragment(profileFragment);
mFragmentManager.beginTransaction().add(R.id.container, myBooksFragment).commit();
mFragment = myBooksFragment;
}
private boolean selectFragment(MenuItem item) {
if (mSelectedItem == item.getItemId()) {
return false;
}
switch (item.getItemId()) {
case R.id.navigation_my_books:
mFragment = hideShowFragment(mFragment, myBooksFragment);
break;
case R.id.navigation_store:
mFragment = hideShowFragment(mFragment, storeFragment);
break;
case R.id.navigation_book_club:
mFragment = hideShowFragment(mFragment, bookClubFragment);
break;
case R.id.navigation_rewards:
mFragment = hideShowFragment(mFragment, rewardsFragment);
break;
case R.id.navigation_profile:
mFragment = hideShowFragment(mFragment, profileFragment);
break;
}
mSelectedItem = item.getItemId();
return true;
}
@Override
public void recyclerViewListClicked(View v, int position) {
}
}