使用navController.currentDestination?.id无法获取Fragment id导致按钮点击无响应

问题根因
你的代码核心问题是id变量的取值时机错误:你在Activity的onCreate生命周期中就获取了navController.currentDestination?.id,这个变量只会在Activity创建时赋值一次,后续导航切换Fragment时,该变量的值不会自动更新,因此点击按钮时的判断逻辑永远基于Activity初始化时的初始值,自然无法触发对应导航操作。
修正方案
将id的取值逻辑移到按钮点击事件的回调内部,每次点击时都获取当前的目的地ID即可,修正后代码如下:
class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding private lateinit var navController: NavController override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) val navHostFragment = supportFragmentManager.findFragmentById(R.id.navHost) as NavHostFragment navController = navHostFragment.navController binding.myButton.setOnClickListener { // 每次点击都实时获取当前的目的地ID val currentId = navController.currentDestination?.id if (currentId == R.id.firstFragment) { navController.navigate(R.id.goto_secondFragment) } else if (currentId == R.id.secondFragment) { navController.navigate(R.id.goto_thirdFragment) } } } }
如果需要在目的地变化时同步更新按钮文案、显示状态等,也可以给navController添加OnDestinationChangedListener监听,在监听回调中处理相关逻辑。
内容的提问来源于stack exchange,提问作者user17489159
相关产品推荐
相关产品推荐

