Deep Link Использование компонента навигации Android открывает неправильный экран - PullRequest
0 голосов
/ 09 ноября 2019

Привет, я учусь, как использовать Android-компонент навигации, и как часть этого я делаю очень простое приложение для тренировок. У меня есть базовая навигация и передача данных между двумя экранами, но часть, на которой я застрял, - это создание глубокой связи. В настоящее время я поместил тег глубокой ссылки в место назначения (фрагмент), который в настоящее время не может быть достигнут любым другим способом. По сути, это третий экран, отдельный от двух других подключенных экранов, и глубокая ссылка - единственный способ получить к нему доступ.

Я поделился своим XML-файлом навигации ниже и своим манифестом.

Здесь находится файл навигации, соответствующий бит - последний тег фрагмента, творчески названный «firstDeepLinkFragment».


<?xml version="1.0" encoding="utf-8"?>
<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/navigation_graph"
    app:startDestination="@id/firstFragment">

    <fragment
        android:id="@+id/firstFragment"
        android:name="android.bignerdranch.navcontrollertest.FirstFragment"
        android:label="navigation_first_fragment"
        tools:layout="@layout/navigation_first_fragment" >
        <action
            android:id="@+id/action_firstFragment_to_secondFragment"
            app:destination="@id/secondFragment"
            app:enterAnim="@anim/nav_default_enter_anim"/>
    </fragment>

    <fragment
        android:id="@+id/secondFragment"
        android:name="android.bignerdranch.navcontrollertest.SecondFragment"
        android:label="navigation_second_fragment"
        tools:layout="@layout/navigation_second_fragment" />

    <fragment
        android:id="@+id/firstDeepLinkFragment"
        android:name="android.bignerdranch.navcontrollertest.FirstDeepLinkFragment"
        android:label="first_deeplink_fragment"
        tools:layout="@layout/first_deeplink_fragment" >
        <deepLink
            android:id="@+id/deepLink"
            app:uri="example://gizmos" />
    </fragment>
</navigation>

Вот манифест.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="android.bignerdranch.navcontrollertest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <nav-graph android:value="@navigation/navigation_graph"/>


        </activity>
    </application>

</manifest>

Итак, из моего понимания того, как работают глубокие ссылки в компоненте навигации, все, что мне нужно сделать, это добавить тег Deep Link к месту назначения, на которое я хочу создать ссылку, установитьURI в качестве атрибута этого тега, а затем добавьте тег nav-graph в манифест и укажите его в правом файле навигационного графика. Если я все правильно настрою, у меня должна быть правильная глубокая связь, и все будет хорошо. Проблема заключается в том, что когда я ввожу следующую команду для проверки глубокой ссылки adb shell am start -W -a android.intent.action.VIEW -d "example://gizmos/", вместо этого открывается действие по умолчанию, или, скорее, назначение по умолчанию (которое является фрагментом, как любое другое назначение, которое я здесь установил).

Я, честно говоря, не уверен, где я мог ошибиться, и сейчас нет тонны информации об этом, поэтому я надеялся получить совет от людей, которые ужевозился с этим. Я знаю старый способ установки глубоких ссылок, заключающийся в написании фильтров намерений в манифесте под тегом активности, на которую мы хотели связать. Но в рамках Навигационного компонента у нас теперь есть только одно основное действие, а все остальные наши экраны / пункты назначения являются фрагментами. И так как фрагменты не должны быть (и, возможно, не должны / не могут быть зарегистрированы) в манифесте, я не знаю, как я мог бы даже установить глубокую связь со старой методологией.

Так что, если бы кто-то мог помочь мне направить меня в правильном направлении, указать на любую глупую ошибку, которую я, возможно, сделал, или устранить недоразумение, я был бы очень признателен. Спасибо.

1 Ответ

1 голос
/ 10 ноября 2019

Согласно этой проблеме ,

Как упомянуто в документации фильтра намерений :

Если фильтр указываетсхема и полномочия, но без пути, все URI с одинаковой схемой и полномочиями совпадают, независимо от их путей.

Когда вы используете app:uri="example://gizmos", example:// является схемойи gizmos - это авторитет, но вы упускаете часть пути. Изменяя ваши глубокие ссылки, чтобы включить путь, Navigation будет правильно соответствовать вашей глубокой ссылке на пункт назначения.

...