Search code examples
androiddeep-linkingandroid-navigationandroid-navigation-graphandroid-deep-link

Opening activity inside a navgraph with a deeplink causing a crash


I have an activity inside an navgraph, directly i am able to navigate to it by below code

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

Please find the navgraph below

<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>

But if i try to navigate to it using deeplink its crashing

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) 

UPDATE please find navhost activity 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>

How can i open an activity inside a navgraph with deeplink ?


Solution

  • As per this issue, this is a known issue with Navigation 2.3.2, already marked as fixed for the upcoming Navigation 2.3.3 release.

    However:

    note that it is never the right approach to attach a <deeplink> to an <activity> destination as that will never give you the right behavior when using an implicit deep link on another app's task (where the system back should immediately take the user back to the app that triggered your deep link). Instead, you should attach your deep link directly to your second activity (either by manually writing the appropriate <intent-filter> or by adding the <deeplink> to the start destination of a nav host in that second activity).

    So really, you should move your <deeplink> off of your activity destination, which will both fix your crash (on every version of Navigation) and actually give you the correct behavior. Any validation you need to do needs to be done on the actual correct activity.