具有查询参数的Jetpack导航深层链接

bak*_*kua 5 regex url android query-parameters android-architecture-navigation

在新的Jetpack导航库中,似乎无法使用查询参数处理深层链接。如果将以下内容添加到navigation.xml: <deepLink app:uri="scheme://host/path?query1={query_value}" />则Deeplink不会打开该片段。

经过一番挖掘后,我发现当罪魁祸首是将url从xml转换为Pattern regex时,是在NavDeepLink中。看起来问题是一个没有被排除的问号。

我写了一个失败的测试:

@Test
fun test() {
    val navDeepLink = NavDeepLink("scheme://host/path?query1={query_value}")
    val deepLink = Uri.parse("scheme://host/path?query1=foo_bar")
    assertEquals(true, navDeepLink.matches(deepLink))
}
Run Code Online (Sandbox Code Playgroud)

要使测试通过,我要做的就是逃脱?如下:

@Test
fun test() {
    val navDeepLink = NavDeepLink("scheme://host/path\\?query1={query_value}")
    val deepLink = Uri.parse("scheme://host/path?query1=foo_bar")
    assertEquals(true, navDeepLink.matches(deepLink))
}
Run Code Online (Sandbox Code Playgroud)

我是否在这里缺少将查询值传递给Fragment的真正基本的功能,或者此功能当前不受支持?

Ham*_*ani 14

您需要将 DeepLink Navigation 添加到 AndroidManifest.xml(处理片段的特殊 Activity),因此当点击 deeplink 时,您的应用程序可以接收 DeepLink 并将其传递给该导航和片段,并且可以将其作为参数读取:

我会把 Kotlin 代码放在这里:

在您的导航文件中,处理带有争论的深层链接的片段必须是这样的:

<fragment
        android:id="@+id/menu"
        android:name="ir.hamplus.fragments.MainFragment"
        android:label="MainFragment">

    <action android:id="@+id/action_menu_to_frg_messenger_main" 
     app:destination="@id/frg_messenger_main"/>

    <deepLink app:uri="http://hamplus.ir/request/?key={key}&amp;id={id}" />

    <argument android:name="key" app:argType="string"/>
    <argument android:name="id" app:argType="string"/>

</fragment>
Run Code Online (Sandbox Code Playgroud)

读取 frasgment /Activity 中的深层链接参数:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
  //Or in activity read the intent?.data
       arguments?.let {
            Log.i("TAG", "Argument=$arguments")

            var key = it.getString("key")
            Log.i("TAG", "key=$key")

            var id = it.getString("id")
            Log.i("TAG", "id=$id")

        }
}
Run Code Online (Sandbox Code Playgroud)

还要在 AndroidManifest.xml 的相关 Activity 中添加导航图:

 <activity
        android:name=".MainActivity"
        android:theme="@style/AppTheme.NoActionBar" >

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

</activity>
Run Code Online (Sandbox Code Playgroud)


Tom*_*tel 0

package androidx.navigation

import android.net.Uri
import androidx.test.runner.AndroidJUnit4
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class NavTest {
    @Test
    fun test() {
        val navDeepLink = NavDeepLink("scheme://host/path\\?query1={query_value1}&query2={query_value2}")
        val deepLink = Uri.parse("scheme://host/path?query1=foo_bar&query2=baz")

        val bundle = navDeepLink.getMatchingArguments(deepLink)!!
        assertTrue(bundle.get("query_value1") == "foo_bar")
        assertTrue(bundle.get("query_value2") == "baz")
    }
}
Run Code Online (Sandbox Code Playgroud)

最后看起来 NavDeepLink 将非转义视为“?” 匹配零或一量词。你需要逃避它。换句话说,我们泄露了未记录的实现细节。

它可能与这种情况无关,但是在使用 add 命令时用“\”转义“&”存在一些类似的问题。

以下频道也谈到了这个问题。