【问题标题】:Navigation safeArgs fails to navigate after back from dialog从对话框返回后,导航 safeArgs 无法导航
【发布时间】:2020-11-21 15:14:42
【问题描述】:

使用 safeArgs 方向从 HomeFragment 导航到其他片段时,我收到 Illegal argumentException: Navigation action/destination pkgname:id/action_nav_home_to_dialog cannot be found from the current destination Destination(pkgname:id/dialog)。 即使点击了 HomeFragment 中的 Button,但当前目的地是 pkgname:id/dialog。

每次从 HomeFragment 导航到其他 Fragment 时,我应该检查当前目的地是否是 HomeFragment 吗? 我应该在对话框关闭上写一些代码吗?

在我的调查中,关闭正常片段后似乎不会发生。

繁殖方式

  1. 创建新的“导航抽屉活动”项目。
  2. 将类路径添加到顶级 gradle 文件的依赖项
def nav_version = "2.3.1"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
  1. 将应用插件行添加到模块级 gradle 文件
apply plugin: "androidx.navigation.safeargs.kotlin"

4.创建对话框片段文件

package pkgname.ui

import android.app.Dialog
import android.os.Bundle
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.DialogFragment
class MyDialog : DialogFragment() {
  override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
      return AlertDialog.Builder(requireActivity())
          .setMessage("hello").create()
  }
}
  1. 将对话框添加到 mobile_navigation.xml 并将操作从主页添加到对话框
    <fragment
        android:id="@+id/nav_home"
        android:name="pkgname.ui.home.HomeFragment"
        android:label="@string/menu_home"
        tools:layout="@layout/fragment_home">
        <action
            android:id="@+id/action_nav_home_to_dialog"
            app:destination="@id/dialog" />
    </fragment>
    <dialog
        android:id="@+id/dialog"
        android:name="pkgname.ui.MyDialog" />

6.将按钮添加到gragment_home.xml

   <com.google.android.material.button.MaterialButton
        android:id="@+id/showDialog"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="show dialog"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
 />
  1. 在 HomeFragment 的 onCreateView 中添加点击动作
 val showDialog: Button = root.findViewById(R.id.showDialog)
        showDialog.setOnClickListener { findNavController().navigate(HomeFragmentDirections.actionNavHomeToDialog()) }
  1. 运行应用程序
  2. 反复点击“显示对话框”按钮

【问题讨论】:

    标签: android kotlin navigation-drawer android-dialogfragment android-safe-args


    【解决方案1】:

    我试过你的代码。它工作正常。对话框按预期显示并关闭,直到我双击“显示对话框”按钮。双击按钮时应用程序开始崩溃。
    在我的情况下,logcat 中显示的错误是,

    java.lang.IllegalArgumentException: 导航目的地 com.xxx.navigationdraweractivity:id/action_nav_home_to_dialog 对此 NavController 是未知的

    正如您在问题中询问的那样,检查当前目的地为我解决了问题。

    像这样在 HomeFragment 中更改按钮单击的代码,

    showDialog.setOnClickListener {
      if (findNavController().currentDestination?.id == R.id.nav_home){
          findNavController().navigate(HomeFragmentDirections.actionNavHomeToDialog())
         }
    }
    

    解决方案来自这里https://stackoverflow.com/a/56168225/14698807

    【讨论】:

    • 谢谢!我没有在这个网站上看到那个消息主题是另一回事。 XD 这似乎是图书馆应该解决的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多