如何使用Android Jetpack的Navigation组件禁用Fragment的后退导航并删除后退箭头?

3
我正在使用谷歌推荐的单一活动模式,并结合Android Jetpack Navigation组件。 Fragment 1是一个身份验证屏幕。在用户经过验证并导航到Fragment 2后,我希望按下Android返回按钮时关闭应用程序,并删除应用栏中的返回箭头。
我已经找到了一些方法,例如'onBackPressedDispatcher',可以添加/删除后退按钮功能,但没有什么方法可以同时移除返回箭头。
当从Fragment 1导航到Fragment 2时,我也尝试了'app:popUpTo ="@+id/firstFragment"',但这也不起作用。
这应该可以通过一行代码来指定。我还在努力寻找。有什么建议吗?

1
这就是你要找的 https://dev59.com/o1MI5IYBdhLWcg3wPpG4#56670377 - coroutineDispatcher
2个回答

23

当导航到fragment2时,您需要从back-stack中删除fragment1

fragment1

<fragment
android:id="@+id/fragment1"
android:name="packagenameforFragment1"
android:label="fragment1"
tools:layout="@layout/fragment_1" >
<action
    android:id="@+id/action_Fragment1_to_Fragment2"
    app:destination="@id/Fragment2_id"
    app:launchSingleTop="true"
    app:popUpTo="@+id/your_MainGraph_id"
    app:popUpToInclusive="true" />

当你从fragment1导航到fragment2时,请调用此函数

findNavController(fragment).navigate(R.id.action_Fragment1_to_Fragment2)

要从Fragment2中移除返回按钮,您可以在Activity的onCreate()方法中使用以下代码:

val appBarConfiguration = AppBarConfiguration
        .Builder(R.id.your_fragment2_id,R.id.any_other_ids_you_want)
        .build()

然后设置您的工具栏如下:

setupActionBarWithNavController(this, yourNavController, appBarConfiguration)

3
谢谢您的回答 - 它实现了从fragment2中删除返回箭头和通过返回按钮关闭应用程序。但是,我发现我还需要将我的fragment1 ID添加到appBarConfiguration中,否则它会在fragment1中显示返回箭头。 - efa303
@mohammed 很好的解决方案,只要你没有使用 DrawerLayout。否则它会显示为返回按钮,但实际上是作为返回按钮的。这会变得混乱。 - Houman
1
@Houman 我认为在这种情况下,您可以使用 addOnDestinationChangedListener 并显示/隐藏操作栏控件,请参阅 https://stackoverflow.com/a/62028322 - Mohammed Alaa
如果我从片段2转到片段3并且想要工具栏,而我只使用一个活动来完成整个应用程序呢? - JPM
1
@JPM 如上所述,您可以在 appBarConfiguration 中分段 2 和分段 3。 - V Surya Kumar

0
这是我的代码,你必须手动设置appBarConfiguration。 就像我的一样。
appBarConfiguration = AppBarConfiguration(setOf(
    R.id.nav_home,
    R.id.nav_safety,
    R.id.nav_myskin,
    R.id.nav_setting
  ))
setupActionBarWithNavController(navController, appBarConfiguration)

完整代码:
package limitless.android.uvindex.ui.activity

import android.content.Intent
import android.os.Bundle
import com.google.android.material.snackbar.Snackbar
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp
import androidx.navigation.ui.setupActionBarWithNavController
import android.view.Menu
import android.view.MenuItem
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.setupWithNavController
import limitless.android.uvindex.R
import limitless.android.uvindex.databinding.ActivityMainBinding
import limitless.android.uvindex.utils.Utils

class MainActivity : AppCompatActivity() {

    private lateinit var appBarConfiguration: AppBarConfiguration
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        setSupportActionBar(binding.toolbar)

        // Get the NavController
        val navController = findNavController(R.id.nav_host_fragment_content_main)
        binding.bnv.setupWithNavController(navController)
        navController.graph = navController.navInflater.inflate(R.navigation.nav_graph)
        appBarConfiguration = AppBarConfiguration(setOf(
            R.id.nav_home,
            R.id.nav_safety,
            R.id.nav_myskin,
            R.id.nav_setting
        ))
        setupActionBarWithNavController(navController, appBarConfiguration)
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        menuInflater.inflate(R.menu.menu_main, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
            R.id.action_premium -> {
                Utils.startActivity(this, Intent(this, PremiumActivity::class.java))
                true
            }
            else -> super.onOptionsItemSelected(item)
        }
    }

}

结果: 截图

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接