使用导航组件的对话框片段
Dialog Fragment Using Navigation Components
我正在尝试使用 android 中的导航组件显示对话框。我已经完成了在 Whosebug
上提出的另一个问题
我在 nav_graph.xml
中添加了对话框组件,如下所示
<dialog
android:id="@+id/dialog"
android:name="com.android.example.ui.MyDialogFragment"
tools:layout="@layout/dialog_fragment" />
我在我的另一个片段中添加了一个动作来显示如下 nav_graph.xml
中的对话框
<fragment
android:id="@+id/Fragment1"
android:name="com.android.example.ui.Fragment1"
android:label="Fragment"
tools:layout="@layout/fragment1">
<action
android:id="@+id/action_fragment1_to_dialog"
app:destination="@id/dialog" />
</fragment>
我创建了一个 kotlin
class MyDialogFragment
如下
class MyDialogFragment : DialogFragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(
R.layout.dialog_fragment,
container, false
)
}
}
这里来自 Fragment1
class,我正在尝试显示如下对话框
findNavController().navigate(R.id.action_fragment1_to_dialog)
当我尝试显示对话框时,出现以下错误
问题 1 已解决
java.lang.ClassCastException: androidx.navigation.fragment.DialogFragmentNavigator$Destination cannot be cast to androidx.navigation.fragment.FragmentNavigator$Destination
at com.android.dairy.MainActivity$onCreate.onDestinationChanged(MainActivity.kt:47)
at androidx.navigation.NavController.dispatchOnDestinationChanged(NavController.java:504)
at androidx.navigation.NavController.navigate(NavController.java:1142)
at androidx.navigation.NavController.navigate(NavController.java:944)
at androidx.navigation.NavController.navigate(NavController.java:877)
at androidx.navigation.NavController.navigate(NavController.java:863)
at androidx.navigation.NavController.navigate(NavController.java:851)
问题2
如何获取 MyDialogFragment 的实例以更新其属性或在 Fragment1
中设置按钮 onClick
侦听器
你的第一个问题是:
java.lang.ClassCastException: androidx.navigation.fragment.DialogFragmentNavigator$Destination
cannot be cast to androidx.navigation.fragment.FragmentNavigator$Destination
at com.android.dairy.MainActivity$onCreate.onDestinationChanged(MainActivity.kt:47)
所以您的问题是您 MainActivity
中的 onDestinationChanged
回调错误地转换了您的目的地类型。您需要更改代码以避免出现这种情况。
你的第二个问题是关于从你的对话中返回一个结果。该文档涵盖 returning a result and even has a section specifically around Additional considerations when using DialogFragments(即 Fragment
的生命周期不受对话框影响,因此在这种情况下使用 NavBackStackEntry
的生命周期可以特别帮助您) .
我正在尝试使用 android 中的导航组件显示对话框。我已经完成了在 Whosebug
我在 nav_graph.xml
中添加了对话框组件,如下所示
<dialog
android:id="@+id/dialog"
android:name="com.android.example.ui.MyDialogFragment"
tools:layout="@layout/dialog_fragment" />
我在我的另一个片段中添加了一个动作来显示如下 nav_graph.xml
<fragment
android:id="@+id/Fragment1"
android:name="com.android.example.ui.Fragment1"
android:label="Fragment"
tools:layout="@layout/fragment1">
<action
android:id="@+id/action_fragment1_to_dialog"
app:destination="@id/dialog" />
</fragment>
我创建了一个 kotlin
class MyDialogFragment
如下
class MyDialogFragment : DialogFragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(
R.layout.dialog_fragment,
container, false
)
}
}
这里来自 Fragment1
class,我正在尝试显示如下对话框
findNavController().navigate(R.id.action_fragment1_to_dialog)
当我尝试显示对话框时,出现以下错误
问题 1 已解决
java.lang.ClassCastException: androidx.navigation.fragment.DialogFragmentNavigator$Destination cannot be cast to androidx.navigation.fragment.FragmentNavigator$Destination
at com.android.dairy.MainActivity$onCreate.onDestinationChanged(MainActivity.kt:47)
at androidx.navigation.NavController.dispatchOnDestinationChanged(NavController.java:504)
at androidx.navigation.NavController.navigate(NavController.java:1142)
at androidx.navigation.NavController.navigate(NavController.java:944)
at androidx.navigation.NavController.navigate(NavController.java:877)
at androidx.navigation.NavController.navigate(NavController.java:863)
at androidx.navigation.NavController.navigate(NavController.java:851)
问题2
如何获取 MyDialogFragment 的实例以更新其属性或在 Fragment1
onClick
侦听器
你的第一个问题是:
java.lang.ClassCastException: androidx.navigation.fragment.DialogFragmentNavigator$Destination
cannot be cast to androidx.navigation.fragment.FragmentNavigator$Destination
at com.android.dairy.MainActivity$onCreate.onDestinationChanged(MainActivity.kt:47)
所以您的问题是您 MainActivity
中的 onDestinationChanged
回调错误地转换了您的目的地类型。您需要更改代码以避免出现这种情况。
你的第二个问题是关于从你的对话中返回一个结果。该文档涵盖 returning a result and even has a section specifically around Additional considerations when using DialogFragments(即 Fragment
的生命周期不受对话框影响,因此在这种情况下使用 NavBackStackEntry
的生命周期可以特别帮助您) .