【问题标题】:Custom Back Button behaviour in Fragment, using Navigation graph片段中的自定义后退按钮行为,使用导航图
【发布时间】:2019-02-18 19:04:47
【问题描述】:

我正在编写一个游戏,其中一个片段连续加载多次,屏幕上的元素数量越来越多,因此难度增加。我用一个导航图来做到这一点,其中关卡有一个对自身的动作,它每次都传递新的参数。到目前为止一切顺利。

唯一的问题是 BackStack:如果我保持默认行为,它会回到同一个片段,但分数数字会发生一些奇怪的变化。如果我将其设置为直接返回主菜单,用户可能会错误地点击后退按钮,最终失去进度。

所以我想显示一个警告对话框,提示您决定是继续游戏还是返回主菜单。

我知道如何创建对话框,但是当按下返回时如何显示它?试图覆盖 onBackPressed()onNavigateUp()onSupportNavigateup() 都会给我一个“不覆盖任何东西”的消息。我还能尝试什么?

【问题讨论】:

    标签: android android-fragments kotlin navigation


    【解决方案1】:

    假设你在Activity中有如下代码来展示片段:

    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction t = fm.beginTransaction();
    t.replace(R.id.test, MyFragment.newInstance(), null);
    t.addToBackStack(null);
    t.commit();
    

    您可以在Activity中覆盖onBackPressed(),例如:

    @Override
    public void onBackPressed() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        // ...
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                MyActivity.super.onBackPressed();
            }
        });
        builder.setNegativeButton("Cancel", null);
        builder.show();
    }
    

    【讨论】:

    • 我使用导航图,因此我使用 onClick():view.findNavController().navigate(R.id.action_levelSelectFragment_to_chromaticFragment) 显示片段,并使用.setPositiveButton("Play next level!") { view?.findNavController()?.navigate(R.id.action_chromaticFragment_self)} 加载以下级别,但无论如何我都会尝试您的代码。一旦我设法将其翻译成 kotlin。
    【解决方案2】:

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

    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()
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多