【问题标题】:Opening activity inside a navgraph with a deeplink causing a crash在导航图中打开活动,带有导致崩溃的深层链接
【发布时间】:2021-01-06 04:40:50
【问题描述】:

我在导航图中有一个活动,我可以通过下面的代码直接导航到它

Navigation.findNavController(requireView())?.navigate(R.id.sampleActivity)

请在下面找到导航图

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/home_nav_graph"
    app:startDestination="@id/appFirstFragment">

    <fragment
        android:id="@+id/appFirstFragment"
        android:name="com.example.deeplinkpoc.AppFirstFragment"
        android:label="fragment_app_first"
        tools:layout="@layout/fragment_app_first" >
    </fragment>
    <activity
        android:id="@+id/sampleActivity"
        android:name="com.example.deeplinkpoc.SampleActivity"
        android:label="activity_sample"
        tools:layout="@layout/activity_sample">
        <deepLink
            android:id="@+id/deepLink2"
            app:uri="https://www.abcdxyz.com/test" />
    </activity>
     </navigation>

但如果我尝试使用深度链接导航到它,它会崩溃

Process: com.example.deeplinkpoc, PID: 12805
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.deeplinkpoc/com.example.deeplinkpoc.HomeActivity}: android.view.InflateException: Binary XML file line #8: Binary XML file line #8: Error inflating class androidx.fragment.app.FragmentContainerView
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2914)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3049)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1809)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6692)
    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:858)
 Caused by: android.view.InflateException: Binary XML file line #8: Binary XML file line #8: Error inflating class androidx.fragment.app.FragmentContainerView
 Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class androidx.fragment.app.FragmentContainerView
 Caused by: android.content.res.Resources$NotFoundException: Unable to find resource ID #0x0
    at android.content.res.ResourcesImpl.getResourceTypeName(ResourcesImpl.java:271)
    at android.content.res.Resources.getResourceTypeName(Resources.java:1986)
    at androidx.navigation.ActivityNavigator.navigate(ActivityNavigator.java:200)
    at androidx.navigation.ActivityNavigator.navigate(ActivityNavigator.java:44)
    at androidx.navigation.NavController.navigate(NavController.java:1057)
    at androidx.navigation.NavController.handleDeepLink(NavController.java:732)
    at androidx.navigation.NavController.onGraphCreated(NavController.java:633)
    at androidx.navigation.NavController.setGraph(NavController.java:590)
    at androidx.navigation.NavController.setGraph(NavController.java:555)
    at androidx.navigation.NavController.setGraph(NavController.java:537)
    at androidx.navigation.fragment.NavHostFragment.onCreate(NavHostFragment.java:248)
    at androidx.fragment.app.Fragment.performCreate(Fragment.java:2684)
    at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:280)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1175)
    at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224) 

更新 请找到 navhost 活动 xml

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".HomeActivity">
<androidx.fragment.app.FragmentContainerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/my_nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    app:navGraph="@navigation/home_nav_graph"
    /></androidx.constraintlayout.widget.ConstraintLayout>

如何使用深度链接打开导航图中的活动?

【问题讨论】:

  • 你可以尝试添加最新的implementation 'androidx.fragment:fragment-ktx:1.2.5'依赖
  • 补充说依赖仍然不起作用
  • 尝试将“android:name="com.example.deeplinkpoc.SampleActivity"”更改为“class="com.example.deeplinkpoc.SampleActivity"”
  • 其内部导航图“类”属性不存在
  • 能否请您粘贴 navHostFragment(xml 文件)中的代码。也许这可以进一步帮助我们。 (错误日志显示:Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class androidx.fragment.app.FragmentContainerView Caused by: android.content.res.Resources$NotFoundException: Unable to find resource ID #0x0 )

标签: android deep-linking android-navigation android-navigation-graph android-deep-link


【解决方案1】:

根据 this issue,这是 Navigation 2.3.2 的一个已知问题,已在即将发布的 Navigation 2.3.3 版本中标记为已修复。

但是:

请注意,将&lt;deeplink&gt; 附加到&lt;activity&gt; 目的地是从不正确的方法,因为在另一个应用程序的任务上使用implicit deep link 时,这永远不会为您提供正确的行为(系统返回应立即将用户带回触发您的深层链接的应用程序)。相反,您应该将深层链接直接附加到您的第二个活动(通过手动编写适当的&lt;intent-filter&gt; 或通过将&lt;deeplink&gt; 添加到第二个活动中导航主机的起始目的地)。

所以说真的,您应该将您的&lt;deeplink&gt; 移出您的活动目的地,这既可以解决您的崩溃问题(在每个版本的 Navigation 上),也可以为您提供正确的行为。您需要对实际正确的活动进行任何验证。

【讨论】:

  • 如果我使用 sampleActivity 直接打开深层链接,我的 UP(左上角按钮)导航不会将他带到上一个屏幕。对于 UP 导航,我想将所有活动保留在 backstack 中,因此我打开一个常见活动并导航到目标活动。
  • 这只是意味着 1) 你没有像 the docs say 那样打电话给super.onSupportNavigateUp() 或者你没有declared a parent activity
【解决方案2】:

确保遵循以下步骤:

  1. NavGraph 添加到 Application 类中的 AndroidManifesto.xml
  2. ACTION_VIEW 添加到DeepLink

如果没有其他办法,那么下面的解决方案肯定会起作用:

  1. AndroidManifesto 中为sampleActivity 添加&lt;activity&gt; 标签。
  2. implicit intent 添加到此sampleActivity 标记,并带有ACTION_VIEW
  3. sampleActivityonCreate 生命周期事件中收集此implicit intent

您不必依赖Navigation ComponentdeepLink 导航到simpleActivity。您可以通过implicit intent 自己注册深度链接,它就可以正常工作。

NavigationComponent 的作用是检测Graph 中存在的DeepLinks 并将它们添加到AndroidManifesto。您的问题可能源于您想要访问的activity,即sampleActivity 位于nestedGraph 中。在这种情况下,不会创建 deepLink。但是,sampleActivity 中的 destionationId 仍将为 NavController 所知。因此解释了为什么您可以从destinationId 访问sampleActivity,但不能从deepLink

要让您的应用程序知道sampleActivitydeepLink,您必须将此deepLink 设置传播到parentGraph。只需在parentGraph 中初始化以下deepLink

 <activity
        android:id="@+id/sampleActivity"
        android:name="com.example.deeplinkpoc.SampleActivity"
        android:label="activity_sample"
        tools:layout="@layout/activity_sample">
        <deepLink
            android:id="@+id/deepLink2"
            app:uri="https://www.abcdxyz.com/test" />

【讨论】:

  • 嗨,我不想通过在清单 xml 中提及来直接打开深度链接活动。我的主要活动将收到深度链接,经过一些验证后,它将通过导航图发送。问题是如果我能够根据导航图 id 打开活动,为什么我不能使用深度链接打开相同的东西。
猜你喜欢
  • 1970-01-01
  • 2015-10-08
  • 2020-07-13
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多