如何在加载上一个片段时更改底部导航工具栏的图标

How to change icon of bottom navigation toolbar on loading previous fragment

我如何使用 bottomNavigationView 当我点击它完美移动但是当我按下后退按钮片段更改为上一个片段但是 bottomNavigationView 的图标没有改变

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;
    }
}; 

当我点击后退时它是改变片段而不是图标所以请帮助我

当你回去的时候,试着做一个 performClick()

View view = bottomNavigationView.findViewById(R.id.YOUR_ACTION);
view.performClick();

我觉得你可以这样设置选中的Item,

BottomNavigationView navView = findViewById(R.id.nav_view);
navView.setSelectedItemId(R.id.navigation_dashboard);

在按下后退按钮的情况下,我认为您已经跟踪了之前用于切换的按钮 ID。在 viewpager 中,我认为它有一个自动机制。

对于带有 BpttomNavigation 和片段的页面,我建议使用 ViewPager

Benifits of ViewPager : flexibility, controllability, performance, cleaner code and nice swip animation on fragment change, and on finger swip.

为了达到你想要的结果,你可以使用这样的东西:

  • 将您的 ViewPager 置于 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>
    
  • 创建您的 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();
    }
    }
    
  • 设置您的视图、片段和适配器:

     @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);
    }
    

你的魔法来了,设置监听器 :

  • ViewPager 页面 selection 侦听器(滑动或其他):

    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,到 select 最后一个片段 onBackPressed() 你应该保持它的位置一个变量并调用 viewPager.setCurrentItem(lastFragmentPosition);,监听器会自动触发,并设置 NavigationView 正确的项目,

    • 您可以检查 lastFragmentPostion 是否等于 viewPager.getCurrentItem(); 以退出 activity 或应用程序.

我已经很长时间没有使用 java 但我相信这段代码没有错误。

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

编码愉快!

我希望您不要在 BottomNavigationBar 的情况下使用 addToBackStack(null) 而是 return 到 onBackPressed();

上的主页片段

为此,您可以使用

FragmentManager manager; Fragment frag = manager.findFragmentById(R.id.your_frame_layout);

并检查 instanceof frag 变量中的对象

`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);
    }`