底部导航图标未相对于加载的片段突出显示

Bottom Navigation icons not highlighting with respect to the loaded fragment

我有,

  1. 两个片段(Fragment1,Fragment2)。
  2. 两个按钮(frag1 中的 Btn1,frag2 中的 Btn2)。
  3. 底部导航视图。

单击 frag1 中的 Btn 后,我们将被定向到 frag2。

单击 frag2 中的 Btn 后,我们将被定向到 frag1。

从片段(1->2 或 2->1)引导时,底部导航视图上的图标保持不变

有没有办法针对加载的片段突出显示该图标?

frag1 中 btn 的点击监听器

this.getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.body_container, new Fragment2()).commit();

frag2 中 btn 的点击监听器

this.getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.body_container, new Fragment1()).commit();

MainActivity 代码中底部导航的 OnItemSelectedListener

((BottomNavigationView)findViewById(R.id.bottom_nav)).setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener(){
            Fragment clickedFragment = null;
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()) { 
                    case R.id.one:  clickedFragment = new Fragment1();  break;
                    case R.id.two:  clickedFragment = new Fragment2();  break;
                }
                getSupportFragmentManager().beginTransaction().replace(R.id.body_container, clickedFragment).commit();
                return true;
            }
        });

setOnItemSelectedListener 仅在 BottomNavigationView 的选定项更改时触发。您当前正在做的是更改当前显示的片段。您应该设置 BottomNavigationView 的选定项,而不是更改片段。这样的东西应该可以工作

((BottomNavigationView) findViewById(R.id.bottom_nav)).setSelectedItemId(R.id.your_menu_item_id);
  1. 在主 activity 所在的同一包中创建一个 class temp 并向其中添加以下字段。

    public static BottomNavigationView bottomNavigationView;
    

看一下代码,我在评论中解释了。

  1. 主要Activity代码

     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
    
         BottomNavigationView bottomNavView = temp.bottomNavigationView = findViewById(R.id.bottom_nav);
    
         //This line, initially when the app is opened, displays the fragment1 by default
         getSupportFragmentManager().beginTransaction().replace(R.id.body_container, new Fragment1()).commit();
    
         bottomNavView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener(){
             @Override
             public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                 Fragment clickedFragment = null;
                 switch (item.getItemId()) {
                     case R.id.one:  clickedFragment = new Fragment1();  break;
                     case R.id.two:  clickedFragment = new Fragment2();  break;
                 }
                 //This line replaces the fragment when user clicks on icon of bottom navigation view
                 getSupportFragmentManager().beginTransaction().replace(R.id.body_container, clickedFragment).commit();
                 return true;
             }
         });
     }
    

3.OnViewCreated 片段 1

@Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        view.findViewById(R.id.btn_to_frag2).setOnClickListener(l->{
            temp.bottomNavigationView.setSelectedItemId(R.id.two);
        });
    }

4.OnViewCreated 片段 2

@Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        view.findViewById(R.id.btn_to_frag1).setOnClickListener(l->{
            temp.bottomNavigationView.setSelectedItemId(R.id.one);
        });
    }