切换Fragment时FAB(悬浮操作按钮)图标不更新问题咨询
问题原因
- 调用时机错误:你仅在
MainActivity的onCreate和onResume生命周期中调用图标修改方法,切换Fragment属于同一Activity内部的页面跳转,不会触发Activity的onResume回调,因此切换页面时图标修改逻辑根本不会执行。 - Fragment获取逻辑不可靠:你使用
nhf.getChildFragmentManager().getFragments().get(0)取当前Fragment,这个列表的首个元素永远是初始加载的HomeFragment,不管后续切换到哪个页面,拿到的实例都是第一个Fragment,所以判断分支永远命中HomeFragment的逻辑,图标自然不会变更。
解决方法
你使用了Navigation组件实现页面导航,官方推荐直接监听导航目的地变更来修改Activity公共控件的状态,修改方式如下:
- 删掉
onCreate和onResume中对fabImages()的手动调用 - 在
onCreate中获取到NavController实例后,添加目的地变更监听,在回调中修改FAB图标,参考代码:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); setSupportActionBar(binding.appBarMain.toolbar); DrawerLayout drawer = binding.drawerLayout; NavigationView navigationView = binding.navView; mAppBarConfiguration = new AppBarConfiguration.Builder( R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow) .setDrawerLayout(drawer) .build(); NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main); // 新增导航目的地监听 navController.addOnDestinationChangedListener((controller, destination, args) -> { int destId = destination.getId(); if (destId == R.id.nav_home) { binding.appBarMain.fab.show(); binding.appBarMain.fab.setImageResource(R.drawable.ic_add_auto_blanco); } else if (destId == R.id.nav_gallery) { binding.appBarMain.fab.show(); binding.appBarMain.fab.setImageResource(R.drawable.ic_save); } else { // 其他页面可以按需隐藏FAB binding.appBarMain.fab.hide(); } }); NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration); NavigationUI.setupWithNavController(navigationView, navController); }
这个监听会在首次加载页面、每次切换Fragment时自动触发,不需要手动调用,直接根据目的地ID判断逻辑比判断Fragment实例更稳定可靠。
内容的提问来源于stack exchange,提问作者user14351570
相关产品推荐
相关产品推荐

