使用jetpack导航导航到BottomSheetDialogFragment



我试图使用jetpack导航从Fragment导航到BottomSheetDialogFragment,但每次我试图导航它时,应用程序都会崩溃,说它找不到类名。

mobile_navigation.xml

<fragment
android:id="@+id/home_dest"
android:name="TestProject.Fragment.HomeFragment">
<action
android:id="@+id/action_home_to_bottom_sheet"
app:destination="@id/bottom_dialog"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right" /></fragment>
<dialog
android:id="@+id/bottom_dialog"
android:name="TestProject.Dialog.BottomDialog" />

BottomDialog.cs

namespace TestProject.Dialog
{
public class BottomDialog : BottomSheetDialogFragment
{
public override View? OnCreateView(LayoutInflater inflater, ViewGroup? container, Bundle? savedInstanceState)
{
base.OnCreateView(inflater, container, savedInstanceState);
return inflater.Inflate(Resource.Layout.bottom_sheet_layout, container, false);
}
}
}

HomeFragment.cs按钮点击导航

private void OnButtonClick(object sender, EventArgs e)
{
var nav = Navigation.FindNavController(Activity, Resource.Id.my_nav_host_fragment);
nav.Navigate(Resource.Id.action_home_to_bottom_sheet);
}

错误

AndroidX.Fragment.App.Fragment+InstantiationException: Unable to instantiate fragment TestProject.Dialog.BottomDialog: make sure class name exists ---> Java.Lang.ClassNotFoundException: TestProject.Dialog.BottomDialog ---> Java.Lang.ClassNotFoundException: Didn't find class "TestProject.Dialog.BottomDialog" on path: DexPathList[[zip file "/data/app/~~aFH8kN7HhPmbIpV2HNo5Pw==/"package_name"-iUb68ulDoLpefgk2DFn_XQ==/base.apk"],nativeLibraryDirectories=[/data/app/~~aFH8kN7HhPmbIpV2HNo5Pw==/package_name-iUb68ulDoLpefgk2DFn_XQ==/lib/arm64, /data/app/~~aFH8kN7HhPmbIpV2HNo5Pw==/package_name-iUb68ulDoLpefgk2DFn_XQ==/base.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64]] 12-21 23:38:50.355 E/AppCenterXamarinCrashes(21237): --- End of inner exception stack trace --- 12-21 23:38:50.355 E/AppCenterXamarinCrashes(21237): --- End of inner exception stack trace ---

有了所有这些,我遇到了一个崩溃,说它找不到名为BottomDialog的类,这是不可能的,因为如果我在mobile_navigation上更改标签,则标签从<对话框到<片段,它确实可以导航,但失去了底部Sheet必须具有的所有行为。我不知道我是错过了什么,还是只是关于xamarin的一些东西不起作用。

有人知道是什么原因造成的吗?为什么?我没主意

已经尝试过清理/重建和重新安装金块,但仍然没有效果。

@doczic,

乍一看,我没有发现任何问题。Java.Lang.ClassNotFoundException的常见原因是nav_graph中的一个拼写错误——(我有很多)与完全限定的片段类名不匹配。我只在我的nav_graphs中使用Fragments,因为我不喜欢额外的东西,比如动画和动作等。我更喜欢通过NavOptions制作动画,它允许你有多种动画等,并允许很大的灵活性。我发现了太多我不喜欢图形的地方,所以现在我把它限制在片段上,然后写额外的代码来导航。

我在生产应用程序的许多地方使用BottomDialogs作为HelperDialogs来解释不那么明显的功能,并允许用户在了解应用程序后选择性地关闭它们。

我有一堆关于NavigationComponent的教程,名为NavigationGraph(x),其中x等于一个数字,它展示了我是如何从标准的东西进化到随着数字的增加通过代码做更多的事情的。

它可能无法解决您的特定问题,但它确实演示了如何使用BottomSheetDialogFragment。NavigationGraph7是我第一次介绍BottomDialogs的项目。还有一个Navigation7Net7项目,但它是转换为Net7项目的同一项目,而NavigationGraph7是xamarin.android经典。

@doczic

它有点简单,无论我做什么都不起作用,因此我开始相信它可能与Xamarin有关

我不会因为对话框不起作用而感到烦恼,因为从长远来看,我怀疑你最终会想要nav_graph中的功能。然而,我怀疑这个问题和沙马林有任何关系。

谷歌在提出NavigationComponent时有一个很好的想法,但也许他们对nav_graph的概念有点太过了。主要的想法是摆脱多个活动和碎片事务。碎片事务是最难处理的事情。退一步,想想任何Android应用程序的整体结构,并考虑每个Android应用程序可能使用的3个重要布局。activity_main、app_bar_main和content_main。最重要的是content_main。它包含FragmentContainerView,其中包含NavHostFragment。无论您的应用程序增长到多大,应用程序中的每个片段都适合FragmentContainerView。这使他们能够隐藏碎片事务的复杂性,而不是废除碎片事务。在任何NavigationGraph项目中都找不到单个片段事务。

在我看来,nav_graph应该只包含片段,换句话说就是占位符。您甚至可以将其用作原型工具——拥有一个代码中甚至还不存在的片段列表。这对建设一个项目没有不良影响。因此,如果说你正在转换一个旧项目,你可以在新项目的nav_graph中指定它。他们偏离轨道的地方包括捆绑包、动画、动作和关于后堆栈应该如何弹出的信息等内容。他们团队中一定有人也提出了NavOptions类,因为正是这个类让我们的开发人员能够手动做我们想做的事情,而不必用所有额外的东西污染nav_graph。

如果你查看NavigationGraph项目,你会发现我一开始是按照他们的方式来做的(那里甚至有一个Xamarin转换的NavigationCodeLab),然后随着项目的增加,我放弃了他们的方法。我真的怀疑,当你可以使用类似BasicDialogFragment的东西时,你会错过nav_graph中的一个特定对话框,它继承自AppCompatDialogFragment,允许在任何地方都具有灵活性。

我已经成功地转换了我的两个生产应用程序,可以说它们比原来的要好得多,也更可靠。

请注意,有些NavigationGraph项目已经转换为Net7项目,因此您可能需要集中精力处理那些没有Net7后缀的项目。

AndroidX.Navigation.FFragment和Navigation.Ui也存在问题,这些问题与它们的依赖关系有关,当你增加这两个依赖关系时,它们会变得明显,需要在Xamarin.Android中进行排序。因此,不要自动将这些包更新到最新版本,请使用每个项目中注明的版本。稍后的项目可能会使用更新的版本,不过当事情得到修复时。然而,没有什么是不能解决的。

忘了提他们在哪里https://github.com/gmck

最新更新