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}&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)
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 命令时用“\”转义“&”存在一些类似的问题。
以下频道也谈到了这个问题。
| 归档时间: |
|
| 查看次数: |
1356 次 |
| 最近记录: |