gpt4 book ai didi

android - 将 Serializable 用作 Android 导航组件的深层链接参数

转载 作者:行者123 更新时间:2023-12-04 11:41:29 25 4
gpt4 key购买 nike

是否可以使用自定义 Serializable使用深层链接时将对象作为 fragment 参数?

我尝试了以下方法 - 在我的导航图 XML 文件中,我添加了以下几行:

<fragment
android:id="@+id/eventFragment"
android:name="com.myapp.EventFragment"
android:label="EventFragment">

<argument
android:name="event"
app:argType="com.myapp.EventId" />

<deepLink app:uri="myapp://event/{event}" />

</fragment>

在哪里 EventId是一个可序列化的数据类:
data class EventId(val value: Long) : Serializable

然后,当我尝试使用 URL myapp://event/4002 运行我的应用程序时,抛出以下异常:
Caused by: java.lang.UnsupportedOperationException: Serializables don't support default values.
at androidx.navigation.NavType$SerializableType.parseValue(NavType.java:834)
at androidx.navigation.NavType$SerializableType.parseValue(NavType.java:787)
at androidx.navigation.NavType.parseAndPut(NavType.java:96)
at androidx.navigation.NavDeepLink.getMatchingArguments(NavDeepLink.java:99)
at androidx.navigation.NavDestination.matchDeepLink(NavDestination.java:366)
at androidx.navigation.NavGraph.matchDeepLink(NavGraph.java:79)
at androidx.navigation.NavController.handleDeepLink(NavController.java:540)
at androidx.navigation.NavController.onGraphCreated(NavController.java:499)
at androidx.navigation.NavController.setGraph(NavController.java:460)
at androidx.navigation.NavController.setGraph(NavController.java:425)
at androidx.navigation.NavController.setGraph(NavController.java:407)
at androidx.navigation.fragment.NavHostFragment.onCreate(NavHostFragment.java:236)

将类型替换为 long ( app:argType="long" ) 解决了这个问题 - 没有异常(exception),一切都按预期工作。

导航库似乎不知道如何将原始值从 URL 转换为我的 EventId类(class)。是否有可能以某种方式注册一个知道如何转换它的适配器?或者也许还有另一种解决方案?

最佳答案

据我所知,除了你所做的之外,你只有另一种选择:Parcelable .

我认为在这种情况下就足够了,但我不确定,但即使没有,这对于任何 future 的 Android 开发来说都是一个很好的建议,例如,当您需要在 Activity 或 fragment 之间发送数据时。

特别是我可以看到您正在使用 Kotlin,它有一个帮助方法可以正确实现它,请参阅:Parcelize .

有了它,您的数据类将如下所示:

@Parcelize
data class EventId(val value: Long) : Parcelable


边注:
出于各种原因,不鼓励使用 Serializable 接口(interface)。出自本书 Effective Java作者 Joshua Bloch长期从事Java工作的人:
Item 85: Prefer alternatives to Java serialization

如果您仍然必须使用 Serializable,本书将介绍必要的细节。

关于android - 将 Serializable 用作 Android 导航组件的深层链接参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58729101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com