How can i use bottomNavigationView
when i click its moving perfectly but when i press back button fragment change to previous fragment but icon of bottomNavigationView
not changed
private BottomNavigationView.OnNavigationItemSelectedListener navListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
Fragment selectedFragment = null;
switch (item.getItemId()) {
case R.id.nav_home:
selectedFragment = new HomeFragment();
break;
case R.id.nav_fav:
selectedFragment = new Fragment();
break;
case R.id.nav_search:
selectedFragment = new SearchFragment();
break;
}
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, selectedFragment).addToBackStack(null).commit();
return true;
}
};
It's change fragment when i click back but not icon so please help me
For pages with BpttomNavigation and Fragments i suggest using ViewPager
Benifits of ViewPager : flexibility, controllability, performance, cleaner code and nice swip animation on fragment change, and on finger swip.
in order to achieve your desired result, you can use something like this :
put your ViewPager above the BpttomNavigation :
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Doesn't need any addition -->
<android.support.v4.view.ViewPager
android:layout_above="@id/bottomNavigation"
android:layout_width="match_parent"
android:id="@+id/viewPager"
android:layout_height="match_parent"/>
<!-- Set up menu and stuff -->
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottomNavigation"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</RelativeLayout>
create your ViewPagerFragmentAdapter :
public class ViewPagerFragmentAdapter extends FragmentPagerAdapter {
private ArrayList<Fragment> fragments;
public ViewPagerFragmentAdapter(FragmentManager fragmentManager, ArrayList<Fragment> fragments) {
super(fragmentManager);
this.fragments = fragments;
}
//Returns fragment by position
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
//Returns fragment count
@Override
public int getCount() {
return fragments.size();
}
}
set up your views, fragments and adapter :
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Initialize views
final ViewPager viewPager = findViewById(R.id.viewPager);
final BottomNavigationView navigationView = findViewById(R.id.bottomNavigation);
//Initialize fragments list
ArrayList fragmentsArray = new ArrayList<Fragment>();
fragmentsArray.add(new FirstFragment());
fragmentsArray.add(new SecondFragment());
fragmentsArray.add(new ThirdFragment());
//Initialize adapter and attach it to view pager
ViewPagerFragmentAdapter adapterViewPager = new ViewPagerFragmentAdapter(
getSupportFragmentManager(),
fragmentsArray
);
viewPager.setAdapter(adapterViewPager);
}
Your magic comes here, set up the listeners :
ViewPager page selection listener (swip or whatever) :
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float v, int i1) { }
@Override
public void onPageSelected(int position) {
//Here goes the magic
switch (position) {
case 0:
navigationView.setSelectedItemId(R.id.menu_first_fragment);
break;
case 1:
navigationView.setSelectedItemId(R.id.menu_second_fragment);
break;
case 2:
navigationView.setSelectedItemId(R.id.menu_third_fragment);
break;
default:
//Handle exception
break;
}
}
@Override
public void onPageScrollStateChanged(int position) { }
});
BottomNavigation item selection listener :
navigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.menu_first_fragment:
viewPager.setCurrentItem(0);
break;
case R.id.menu_second_fragment:
viewPager.setCurrentItem(1);
break;
case R.id.menu_third_fragment:
viewPager.setCurrentItem(2);
break;
default: return false;
break;
}
//I'm not sure if you should return true or false but you can try
return true;
}
});
Finally, to select the last fragment onBackPressed() you should keep it's position in a variable and call viewPager.setCurrentItem(lastFragmentPosition);, the listener will be automatically triggered, and sets NavigationView correct item,
I haven't worked with java for a long time but i believe this code contains no errors.
Note : You can initialize your fragments directly in your adapter in getItem(position) method if you want to return a new instance of the fragment every time this method is called, in this case you won't need the ArrayList in your constructor, don't forget to return the number of fragments in getCount() method
Happy coding!