从对话框返回后导航 safeArgs 无法导航
Navigation safeArgs fails to navigate after back from dialog
当使用 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 中的按钮,当前目的地是 pkgname:id/dialog.
每次从HomeFragment导航到其他Fragment时,是否需要检查当前目的地是否为HomeFragment?
我应该在对话框关闭时写一些代码吗?
根据我的调查,关闭正常片段后似乎不会发生这种情况。
重现方式
- 创建新的“Navigation Drawer Activity”项目。
- 将类路径添加到顶级 gradle 文件的依赖项中
def nav_version = "2.3.1"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
- 将应用插件行添加到模块级别 gradle 文件
apply plugin: "androidx.navigation.safeargs.kotlin"
4.create 对话框片段文件
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()
}
}
- 将对话框添加到 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.add 按钮到 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"
/>
- 在 HomeFragment 的 onCreateView 添加点击动作
val showDialog: Button = root.findViewById(R.id.showDialog)
showDialog.setOnClickListener { findNavController().navigate(HomeFragmentDirections.actionNavHomeToDialog()) }
- 运行 应用程序
- 一次又一次点击“显示对话框”按钮
我试过你的代码。它工作正常。对话框按预期显示和关闭,直到我双击“SHOW DIALOG”button.The 应用程序在双击按钮时开始崩溃。
在我的例子中,logcat 中显示的错误是,
java.lang.IllegalArgumentException: navigation destination com.xxx.navigationdraweractivity:id/action_nav_home_to_dialog is unknown to this NavController
正如你在问题中所问,检查当前目的地为我解决了这个问题。
像这样更改 HomeFragment 中按钮点击的代码,
showDialog.setOnClickListener {
if (findNavController().currentDestination?.id == R.id.nav_home){
findNavController().navigate(HomeFragmentDirections.actionNavHomeToDialog())
}
}
解决方案来自这里
当使用 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 中的按钮,当前目的地是 pkgname:id/dialog.
每次从HomeFragment导航到其他Fragment时,是否需要检查当前目的地是否为HomeFragment? 我应该在对话框关闭时写一些代码吗?
根据我的调查,关闭正常片段后似乎不会发生这种情况。
重现方式
- 创建新的“Navigation Drawer Activity”项目。
- 将类路径添加到顶级 gradle 文件的依赖项中
def nav_version = "2.3.1"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
- 将应用插件行添加到模块级别 gradle 文件
apply plugin: "androidx.navigation.safeargs.kotlin"
4.create 对话框片段文件
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()
}
}
- 将对话框添加到 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.add 按钮到 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"
/>
- 在 HomeFragment 的 onCreateView 添加点击动作
val showDialog: Button = root.findViewById(R.id.showDialog)
showDialog.setOnClickListener { findNavController().navigate(HomeFragmentDirections.actionNavHomeToDialog()) }
- 运行 应用程序
- 一次又一次点击“显示对话框”按钮
我试过你的代码。它工作正常。对话框按预期显示和关闭,直到我双击“SHOW DIALOG”button.The 应用程序在双击按钮时开始崩溃。
在我的例子中,logcat 中显示的错误是,
java.lang.IllegalArgumentException: navigation destination com.xxx.navigationdraweractivity:id/action_nav_home_to_dialog is unknown to this NavController
正如你在问题中所问,检查当前目的地为我解决了这个问题。
像这样更改 HomeFragment 中按钮点击的代码,
showDialog.setOnClickListener {
if (findNavController().currentDestination?.id == R.id.nav_home){
findNavController().navigate(HomeFragmentDirections.actionNavHomeToDialog())
}
}
解决方案来自这里