使用深度链接在导航图中打开活动导致崩溃

问题描述

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

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>

如何在带有深层链接的导航图中打开活动?

解决方法

确保遵循以下步骤:

  1. 3 已添加到 NavGraph 中的 Application 类。
  2. AndroidManifesto.xml 添加到 ACTION_VIEW

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

  1. DeepLink 中为 <activity> 添加 AndroidManifesto 标签。
  2. sampleActivity 添加到此 implicit intent 标记中,使用 sampleActivity
  3. ACTION_VIEWimplicit intent 生命周期事件中收集此 sampleActivity

您不必依赖 onCreateNavigation Component 导航到 simpleActivity。您可以通过 deepLink 自己注册深层链接,它会正常工作。

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

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

parentGraph
,

我不相信 activity 布局。所以,我的回答可能是错误的。

来自您的错误日志 Unable to start activity ComponentInfo()

您在调用另一个活动布局内的活动时遇到问题。 您可以使用 linearLayout 代替 activity

<linearLayout
    android:id="@+id/sampleActivity"
    android:orientation="vertical"
    tools:layout="@layout/activity_sample">
    <deepLink
        android:id="@+id/deepLink2"
        app:uri="https://www.abcdxyz.com/test" />
</linearLayout>

还有另一种方法可以做到这一点。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...