【问题标题】:How do I fix `Navigation action/destination cannot be found from the current destination Destination` error in my case?在我的情况下,如何解决“无法从当前目的地目的地找到导航操作/目的地”错误?
【发布时间】:2021-06-14 20:09:11
【问题描述】:

我正在使用bottom navigation

在切换的画面中,还有打开dialog fragment的功能。

我也为此使用了导航。

这是因为,一旦这个dialog 完成,data 就必须传送到打开对话框的屏幕上。

我为此使用了safe args

但我得到了与标题相同的错误。

我知道错误在哪里,但我不知道它发生的确切原因。

在Stack Overflow上搜索了一下,有和我遇到过同样问题的人,但是由于情况不同,好像不是一个确切的解决方案。

nav_graph

<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>

MainActivity

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

DialogFragment

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

【问题讨论】:

  • very specific guidance for returning a result from a DialogFragment。您是否有理由不遵循该指导?
  • 看起来您有多个 NavControllers 和方法 findNavController 为您的案例返回错误的 NavController。
  • @ianhanniballake 我刚刚看了this 并关注了它。我以为我可以参考这个。无论如何,我会尝试参考您的链接。
  • @ianhanniballake 嗯...不是根据您的链接...但是在打开fragmentnavigate() 中使用dialog 解决了它。我没有在正文中发布片段的代码,但实际上我使用constructorshow() 打开了对话框,而不是navigate()。所以我想这就是问题所在。顺便说一句,您提供的链接似乎也与对话框有关,但我不知道文档要说什么。

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


【解决方案1】:

可以通过在导航前先检查当前目的地来解决

例如

片段 A、B 和 C

在单击片段 A 中导航到 C 的按钮时从 A 导航到 B 在某些情况下可能会导致崩溃

为此,您应该首先检查当前目的地,如下所示:

if(findNavController().currentDestination?.id==R.id.AFragment)
   findNavController().navigate(
   AFragmentDirections.actionAFragmentToCFragment()
 )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    相关资源
    最近更新 更多