为什么 Dialog 没有 NavController [Missing]?
Why Dialog does not have a NavController [Missing]?
我正在尝试在我的应用程序中使用最新更新的导航组件
我可以在 nav graph
中添加对话框 (BottomSheetDialogFragment
)
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: View
androidx.constraintlayout.widget.ConstraintLayout{550ae09 V.E......
........ 1,1-719,526} does not have a NavController set
at androidx.navigation.Navigation.findNavController(Navigation.java:84)
at com.andor.navigate.notepad.listing.fragment.SettingFragment$onActivityCreated.onClick(SettingFragment.kt:56)
at android.view.View.performClick(View.java:7352)
at android.view.View.performClickInternal(View.java:7318)
at android.view.View.access00(View.java:846)
at android.view.View$PerformClick.run(View.java:27800)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7045)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
我的目标是从另一个对话框打开一个对话框,但由于某种原因我的对话框没有(缺少)NavController。
我已经参考了来源code
A DialogFragment
在一个完全独立的 window 中运行,它与您的 NavController
.
不在同一视图层次结构中
您应该使用 NavHostFragment.findNavController(this)
(其中 this
是您的 DialogFragment
))或 Kotlin 扩展 findNavController()
如果您使用 fragment-ktx
依赖项沿着 fragment 层级向上查找您的 NavController。
我正在尝试在我的应用程序中使用最新更新的导航组件
我可以在 nav graph
BottomSheetDialogFragment
)
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: View androidx.constraintlayout.widget.ConstraintLayout{550ae09 V.E...... ........ 1,1-719,526} does not have a NavController set at androidx.navigation.Navigation.findNavController(Navigation.java:84) at com.andor.navigate.notepad.listing.fragment.SettingFragment$onActivityCreated.onClick(SettingFragment.kt:56) at android.view.View.performClick(View.java:7352) at android.view.View.performClickInternal(View.java:7318) at android.view.View.access00(View.java:846) at android.view.View$PerformClick.run(View.java:27800) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7045) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
我的目标是从另一个对话框打开一个对话框,但由于某种原因我的对话框没有(缺少)NavController。
我已经参考了来源code
A DialogFragment
在一个完全独立的 window 中运行,它与您的 NavController
.
您应该使用 NavHostFragment.findNavController(this)
(其中 this
是您的 DialogFragment
))或 Kotlin 扩展 findNavController()
如果您使用 fragment-ktx
依赖项沿着 fragment 层级向上查找您的 NavController。