android - 在我的情况下,如何修复“无法从当前目的地目的地找到导航操作/目的地”错误?
问题描述
我正在使用bottom navigation
.
在切换的屏幕中,还有一个打开dialog fragment
.
我也为此使用了导航。
这是因为,一旦dialog
完成,data
必须将其传送到打开对话框的屏幕。
我用safe args
这个。
但我得到了与标题相同的错误。
我知道错误在哪里,但我不知道它发生的确切原因。
根据 Stack Overflow 上的搜索,有人和我有同样的问题,但由于情况不同,这似乎不是一个确切的解决方案。
导航图
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/calendar">
<fragment
android:id="@+id/calendar"
android:name="com.example.writeweight.fragment.CalendarFragment"
android:label="fragment_calendar"
tools:layout="@layout/fragment_calendar" >
</fragment>
<fragment
android:id="@+id/list"
android:name="com.example.writeweight.fragment.WorkoutListFragment"
android:label="fragment_workout_list"
tools:layout="@layout/fragment_workout_list" />
<fragment
android:id="@+id/write"
android:name="com.example.writeweight.fragment.WritingRoutineFragment"
android:label="WritingRoutineFragment"
tools:layout="@layout/fragment_writing_routine">
<action
android:id="@+id/action_write_to_bodyPartDialog"
app:destination="@id/bodyPartDialog" />
<argument
android:name="title"
app:argType="string"
android:defaultValue="Write" />
</fragment>
<dialog
android:id="@+id/bodyPartDialog"
android:name="com.example.writeweight.fragment.BodyPartDialogFragment"
android:label="BodyPartDialogFragment"
tools:layout="@layout/fragment_body_part_dialog">
<action
android:id="@+id/action_bodyPartDialog_to_write"
app:destination="@id/write">
</action>
</dialog>
</navigation>
主要活动
class MainActivity : AppCompatActivity() {
private lateinit var bottomNav: BottomNavigationView
private lateinit var navController: NavController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
bottomNav = findViewById(R.id.bottom_nav)
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_container) as NavHostFragment
navController = navHostFragment.navController
bottomNav.setupWithNavController(navController)
}
}
对话片段
class BodyPartDialogFragment : DialogFragment() {
private lateinit var ll: LinearLayout
private lateinit var startBtn: Button
private lateinit var title: String
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view: View = inflater.inflate(R.layout.fragment_body_part_dialog, container, false)
initView(view)
setLayout()
startBtn?.setOnClickListener { v ->
title = BodyPartCustomView.getTitle()
val action = BodyPartDialogFragmentDirections.actionBodyPartDialogToWrite(title)
findNavController()?.navigate(action) // Possibly the location of the error.
dismiss()
}
return view
}
private fun initView(view: View) {
ll = view.findViewById(R.id.ll_body_part)
startBtn = view.findViewById(R.id.start)
}
private fun setLayout() {
ll?.apply { clipToOutline = true }
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dialog:Dialog = super.onCreateDialog(savedInstanceState)
dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
dialog.setCanceledOnTouchOutside(false)
return dialog
}
override fun onDismiss(dialog: DialogInterface) {
Toast.makeText(context, "CHECK", Toast.LENGTH_SHORT).show()
}
}
解决方案
可以通过在导航前先检查当前目的地来解决
例如
片段 A、B 和 C
在单击片段 A 中导航到 C 的按钮时从 A 导航到 B 在某些情况下可能会导致崩溃
为此,您应该首先检查当前目的地,如下所示:
if(findNavController().currentDestination?.id==R.id.AFragment)
findNavController().navigate(
AFragmentDirections.actionAFragmentToCFragment()
)
推荐阅读
- html - “父”元素的边框落后于 :after-element
- c# - C# API HTTP 动态参数
- python - python,conda:错误:由于 OSError 无法安装软件包:[WinError 5] 访问被拒绝:'d:\\anaconda3\\envs\\python39\\scripts\\pip.exe'
- node.js - 请求一条路线,但我响应另一条路线
- next.js - 如何在 nextjs 12 middlware 中获得下一个身份验证会话
- python - 如何在没有 Pandas 的情况下转置列表
- python - python请求模块无法使用错误信息
- python - 在文件路径/文件名之间查找序列的快速方法
- flutter - 如何在颤动中制作数组对象的模型
- php - 如何使用表格中的图像来图像 corousel?