Meh*_*iya 7 android android-fragments android-jetpack android-jetpack-navigation
我在我的应用程序中使用具有一个活动和两个片段的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>
Run Code Online (Sandbox Code Playgroud)
当用户选择从Android sharesheet我的应用程序,最终目标是通过从接收到的意图的片段B目前数据,我接收到意图在片段A(家庭片段),然后使用NavController
导航到片段B使用下面的代码。
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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题在于,当打开片段B时,按下工具栏的后退按钮或后退箭头(即使多次按下),也不会出现片段A,并且片段B会继续出现。
我不知道我在想什么。当用户从另一个应用程序内的共享表打开该应用程序时,这是打开特定片段的正确方法吗?
编辑
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true">
<fragment
android:id="@+id/navHostFragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph" />
<com.google.android.material.bottomappbar.BottomAppBar
android:id="@+id/bottomAppBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
app:fabCradleMargin="8dp"
/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fabMainActivity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_add"
app:layout_anchor="@id/bottomAppBar" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)
为什么你不能直接去Fragment
乙一旦收到了Intent
额外的在你的Activity
。只是代替的定义Fragment
在XML中,或作为startDestination
你可以简单地进行开关Fragment
乙
在Activity
:
Navigation
.findNavController(binding.root)
.navigate(
R.id.navigation_from_intent_actions, bundle,
NavOptions.Builder()
.setIntentExtra(extras)
.build()
)
Run Code Online (Sandbox Code Playgroud)
更新
要返回上一个片段,您可以轻松地Fragment
从FragmentManager
(它不会被杀死,因为它是您的家Fragment
)。您可以通过以下方式进行操作:
private fun returnWithName() {
val name = name_input.text.toString()
(targetFragment as? FragmentA)?.setName(name)
activity?.supportFragmentManager?
.popBackStackImmediate()
}
Run Code Online (Sandbox Code Playgroud)
稍后只需检查来自FragmentB
. 到Fragment
您需要导航。
笔记。还有另一种与 Shared 共享数据的方法ViewModel
。但是,您需要将结果从ViewModel
back传输到FragmentA
. 然后检查新的交易参数。它还描述。
归档时间: |
|
查看次数: |
136 次 |
最近记录: |