Reputation: 5
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
Upvotes: 0
Views: 885
Reputation: 60
I would prefer you do not use addToBackStack(null)
in case of BottomNavigationBar
and instead return to home fragment on onBackPressed();
For that, you can use
FragmentManager manager;
Fragment frag = manager.findFragmentById(R.id.your_frame_layout);
and check the instanceof
the object in frag
variable
`if (frag instanceof HomeFragment) {
super.onBackPressed();//Exits the app if home fragment
} else {
manager.beginTransaction().replace(R.id.frame_layout, new HomeFragment()).commit();
//returns to home fragment when user presses back button
navigation.setSelectedItemId(R.id.navigation_home);
}`
Upvotes: 0
Reputation: 2521
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!
Upvotes: 1
Reputation: 2119
I think you can set the selected Item like this,
BottomNavigationView navView = findViewById(R.id.nav_view);
navView.setSelectedItemId(R.id.navigation_dashboard);
In case of back button pressing, you have keep track of the previous button id's for switching I think. In the viewpager, I think there's an automatic mechanism for it.
Upvotes: 0
Reputation: 6073
when you go back , try to do a performClick()
View view = bottomNavigationView.findViewById(R.id.YOUR_ACTION);
view.performClick();
Upvotes: 0