为什么Dialog没有NavController [Missing]?

时间:2019-06-18 10:52:22

标签: android kotlin androidx android-navigation android-architecture-navigation

我正在尝试在应用程序中使用Nav Component的最新更新

我可以在其中BottomSheetDialogFragment中添加对话框(nav graph

nav_version = "2.1.0-alpha05"

我的nav_graph中的部分代码:

    <dialog
        android:id="@+id/settingFragment"
        android:name="com.andor.navigate.notepad.listing.fragment.SettingFragment"
        tools:layout="@layout/fragment_setting">
        <action
            android:id="@+id/action_settingFragment_to_confirmationFragment"
            app:destination="@id/confirmationFragment" />
    </dialog>
    <dialog
        android:id="@+id/confirmationFragment"
        android:name="com.andor.navigate.notepad.ConfirmationFragment"
        tools:layout="@layout/fragment_confirmation" />

在我的设置片段中,我有一个按钮(logout_btn)来触发动作:action_settingFragment_to_confirmationFragment

设置片段OnActivityCreated中的

代码:

    logout_btn.setOnClickListener {
       Navigation.findNavController(view!!).navigate(R.id.action_settingFragment_to_confirmationFragment)
    } 

当我单击按钮时,出现运行时异常:

  

java.lang.IllegalStateException:视图   androidx.constraintlayout.widget.ConstraintLayout {550ae09 V.E ...   ........ 1,1-719,526}没有设置NavController           在androidx.navigation.Navigation.findNavController(Navigation.java:84)           在com.andor.navigate.notepad.listing.fragment.SettingFragment $ onActivityCreated $ 2.onClick(SettingFragment.kt:56)           在android.view.View.performClick(View.java:7352)           在android.view.View.performClickInternal(View.java:7318)           在android.view.View.access $ 3200(View.java:846)           在android.view.View $ PerformClick.run(View.java:27800)           在android.os.Handler.handleCallback(Handler.java:873)           在android.os.Handler.dispatchMessage(Handler.java:99)           在android.os.Looper.loop(Looper.java:214)           在android.app.ActivityThread.main(ActivityThread.java:7045)           在java.lang.reflect.Method.invoke(本机方法)           在com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:493)           在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)

我的目的是从另一个对话框中打开一个对话框,但是由于某种原因,我的对话框没有(缺少)NavController。

我已经提到了来源code

1 个答案:

答案 0 :(得分:3)

DialogFragment在完全独立的窗口中运行,该窗口与NavController不在同一个视图层次中。

如果您使用的是NavHostFragment.findNavController(this)依赖项,则应该使用this(其中DialogFragment是您的findNavController())或Kotlin扩展名fragment-ktx fragment 层次结构来找到您的NavController。