使用导航图的片段中的自定义后退按钮行为

时间:2019-02-18 19:04:47

标签: android android-fragments kotlin navigation

我正在写一个游戏,其中一个片段连续加载几次,并且屏幕上的元素数量不断增加,因此难度增加。我使用导航图来执行此操作,其中级别对自身具有作用,每次都会传递新参数。到目前为止一切顺利。

唯一的问题是BackStack:如果我保留默认的行为,它将返回到相同的片段,但是分数有一些奇怪的变化。如果我将其设置为直接返回主菜单,则用户可能会误按“后退”按钮,最终会失去进度。

所以我想显示一个警告对话框,提示您决定恢复游戏或返回主菜单。

我知道如何创建对话框,但是当按下后退键时如何显示该对话框?尝试覆盖onBackPressed()onNavigateUp()onSupportNavigateup()都会给我一个“不覆盖任何内容”的信息。我还能尝试什么?

2 个答案:

答案 0 :(得分:1)

假设您在“活动”中具有以下代码以显示片段:

行吧//<a href='/n/夏正正'>@夏正正</a>:我没有,我没说过。<span class="url-icon"><img alt=[感冒] src="//h5.sinaimg.cn/m/emoticon/icon/default/d_ganmao-babf39d6ae.png" style="width:1em; height:1em;" /></span>//<a href='/n/勺布斯'>@勺布斯</a>:<span class="url-icon"><img alt=[二哈] src="//h5.sinaimg.cn/m/emoticon/icon/others/d_erha-0d2bea3a7d.png" style="width:1em; height:1em;" /></span>//<a href='/n/暴躁豆奶包'>@暴躁豆奶包</a>:逃避虽然舒服但没用//<a href='/n/by语冰'>@by语冰</a>: 难受//<a href='/n/-Lillyyyyyy-'>@-Lillyyyyyy-</a>:扎心

您可以在“活动”中覆盖FragmentManager fm = getSupportFragmentManager(); FragmentTransaction t = fm.beginTransaction(); t.replace(R.id.test, MyFragment.newInstance(), null); t.addToBackStack(null); t.commit(); ,例如:

onBackPressed()

答案 1 :(得分:0)

我在主要活动中最终使用了以下代码:

override fun onBackPressed() {
    val navController = Navigation.findNavController(this, R.id.fragment5)
    println(navController.currentDestination?.label)
    if(navController.currentDestination?.label.toString() == "ChromaticFragment"){
        val dialogBuilder = AlertDialog.Builder(this)

        dialogBuilder.setMessage("What do you want to do?")

            .setNeutralButton("Resume Level") { dialog, _ ->
                dialog.dismiss()
            }
            .setPositiveButton("Play next level") { _, _ ->
                FullscreenActivity.level.levelSelection(FullscreenActivity.makeLevel.nextlevelsetup)
                navController.navigate(R.id.action_chromaticFragment_self)
            }
            .setNegativeButton("Exit to Main Menu") { _, _ ->
                navController.popBackStack(R.id.mainFragment, true)
                navController.navigate(R.id.action_global_mainFragment)
            }

        val alert = dialogBuilder.create()
        alert.show()
    }
    else {
        super.onBackPressed()
    }
}