我在我的应用程序中使用具有一个活动和两个片段的Jetpack Navigation(片段A也是家庭片段,而片段B可以从片段A导航)。
在intent-filter
上添加了一个MainActivity
,如下所示,它可以接受纯文本。
<activity android:name=".MainActivity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="@string/text_mime_type_text_plain"/>
</intent-filter>
</activity>
当用户从Android共享表中选择我的应用时,最终目标是将从Intent接收到的数据传递给FragmentB。目前,我正在Fragment A(Home Fragment)中接收Intent,然后使用{{ 1}},使用以下代码导航至片段B。
NavController
问题在于,当打开片段B时,按下工具栏的后退按钮或后退箭头(即使多次按下),也不会出现片段A,并且片段B会继续出现。
我不知道我在想什么。当用户从另一个应用程序内的共享表打开该应用程序时,这是打开特定片段的正确方法吗?
修改
activity_main.xml
private fun checkReceivedIntent() {
val receivedUrlIntent = activity?.intent
val intentAction = receivedUrlIntent?.action
val intentType = receivedUrlIntent?.type
if (intentAction == Intent.ACTION_SEND && intentType != null) {
if (intentType == getString(R.string.text_mime_type_text_plain) ) {
val receivedText = receivedUrlIntent.getStringExtra(Intent.EXTRA_TEXT)
val action = FragmentADirections.actionFragmentAToFragmentB(receivedText)
findNavController().navigate(action)
}
}
}
答案 0 :(得分:3)
为什么在收到Fragment
中的Intent
额外费用后,您无法直接前往Activity
B。只需代替在xml中定义Fragment
,或作为startDestination
,您只需执行切换到Fragment
B
在Activity
中:
Navigation
.findNavController(binding.root)
.navigate(
R.id.navigation_from_intent_actions, bundle,
NavOptions.Builder()
.setIntentExtra(extras)
.build()
)
更新
要返回上一个片段,您可以轻松地从Fragment
获取FragmentManager
(它不会被杀死,因为它是您的家Fragment
)。您可以采用以下方式:
private fun returnWithName() {
val name = name_input.text.toString()
(targetFragment as? FragmentA)?.setName(name)
activity?.supportFragmentManager?
.popBackStackImmediate()
}
然后再检查来自FragmentB
的更新结果。您需要导航到哪个Fragment
。
注意。还有另一种与Shared ViewModel
共享数据的方法。但是,您需要将结果从ViewModel
转移回FragmentA
。然后检查新的交易参数。是also described here。