簡體   English   中英

按鈕返回帶有導航組件的 startDestination

[英]button back in startDestination with navigation component

我需要一個帶有導航圖的第二個活動,並在工具欄中有一個返回按鈕到第一個也包含導航圖的活動

在我的第二個活動中,如果出現后退箭頭按鈕但在活動中沒有,我在進入片段時有 onSupportNavigateUp 和 setupActionBarWithNavController。

嘗試在活動和片段中添加 setHomeButtonEnabled 和 setDisplayHomeAsUpEnabled ,如果按鈕出現回來,但是當我在前面輸入一些片段並返回片段時, startDestination 按鈕消失了

我只需要將按鈕保持在活動中並解決我的問題

您可以通過指定 setFallbackOnNavigateUpListener 來實現:

private fun setupToolbar() {
    val navController = findNavController(R.id.nav_host_fragment)

    val appBarConfiguration =
        AppBarConfiguration.Builder()
            .setFallbackOnNavigateUpListener { onNavigateUp() }
            .build()

    dataBinding.toolbar.apply {
        setupWithNavController(navController, appBarConfiguration)
    }
}

然后在活動中做任何你想做的事情:

override fun onNavigateUp(): Boolean {
    finish()
    return true
}

你不能,活動有自己的工具欄,在你的情況下,他們有兩個不同的 NavControllers。 因此,您的第二個活動為他的片段管理 NavUp 按鈕,當開始目標片段出現時,NavUpButton(Backbutton) 消失,因為它沒有留下任何目的地。 如果您以編程方式在該(第二個活動)的開始目標上顯示 NavUp 按鈕並管理 onClick 並啟動第一個活動,該活動總是轉到第一個活動片段的開始目標,因為它有自己的導航控制器。

問題是導航 UI 不是那樣工作的。 更好的方法是僅使用一個具有多個片段的活動。 並使用任何其他方法在同一個導航控制器中解決您的問題。

添加setHomeButtonEnabled功能。 到您的返回操作。 如果您使用按鈕返回,將其添加到 onClick 或使用 backPress,覆蓋 backPress。

使用此解決方案:當您嘗試返回 startDestination 時,您將設置按鈕啟用。

我創建了一個界面來顯示/隱藏導航主機活動中的按鈕。 以下是活動如何實現顯示/隱藏按鈕的界面方法:

    override fun showUpButton() {
    val navController = this.findNavController(R.id.nav_host)
    val listener = AppBarConfiguration.OnNavigateUpListener { navController.navigateUp() }
    val abc = AppBarConfiguration.Builder().setFallbackOnNavigateUpListener(listener).build()
    NavigationUI.setupActionBarWithNavController(this, navController, abc)
}


override fun hideUpButton() {
    val navController = this.findNavController(R.id.nav_host)
    NavigationUI.setupActionBarWithNavController(this, navController)
}

這是按下向上按鈕時活動中的方法:

    override fun onSupportNavigateUp(): Boolean {
    val navController = this.findNavController(R.id.nav_host)
    if(!navController.navigateUp()){ // When in start destination
        onBackPressed()
    }
    return navController.navigateUp()
}

每當按下后退按鈕(不是向上按鈕)時,片段都可以收聽:

    private fun setupBackPress() {
    requireActivity()
        .onBackPressedDispatcher
        .addCallback(this, object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() { 
            }
        })
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM