通过 Firebase 动态打开应用程序后,当应用程序打开时,片段自动跳转到导航图的 startdestination 片段 link
Fragment automatically jumps to startdestination fragment of navigation graph when app opens after opening app through a Firebase dynamic link
我正在使用 Firebase Dynamic links 与其他用户共享特定产品。我能够创建产品共享 link。 link 生成良好。我在主登录 activity 中检测到 link,它是应用程序的启动器 activity。
link 也被检测到。我有 2 个导航图。一个用于登录过程,一个用于主应用程序。我必须从登录图中打开主图中的特定片段。我正在检测登录图中的 link 并创建一个深度 link,如下所示:
navController.createDeepLink()
.setComponentName(MainActivity::class.java)
.setGraph(R.navigation.nav_graph_main)
.setDestination(R.id.storeFragment)
.setArguments(bundle)
.createPendingIntent()
.send()
问题是,当我打开 storeFragment 时,应用会跳转到 nav_graph_main 的主页片段。它不会停留在 newFragment。只是一瞬间。
我的nav_graph_main如下:
<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/nav_graph_main"
app:startDestination="@id/homeFragment">
...other fragments
<fragment
android:id="@+id/storeFragment"
android:name="in.indiahaat.feature.main.home.store_screen.StoreFragment"
android:label="fragment_store"
tools:layout="@layout/fragment_store" >
<action
android:id="@+id/action_storeFragment_pop"
app:popUpTo="@id/storeFragment"
app:popUpToInclusive="true" />
<action
android:id="@+id/storeFragment_to_reportRetailerFragment"
app:popUpTo="@id/reportRetailerFragment"
app:destination="@id/reportRetailerFragment" />
</fragment>
...other fragments
</navigation>
请post解决这个问题,因为我已经坚持了一段时间了。
我有一种类似的方法可以根据条件重定向到不同的片段。但情况不同。
我不得不根据登录用户的类型和注册状态重定向到不同的片段。使用子导航也可以。
为此,我必须将 data/condition 发送到着陆片段。基于此数据重定向是可能的。
您的场景也可以尝试类似的方法。
NOTE: Although the below did not included Firebase and corresponding
dependencies.
<!-- Parent Graph -->
<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/nav_graph"
app:startDestination="@id/landingFragment">
<!-- Landing Child Graph -->
<navigation
android:id="@+id/landingFragment"
app:startDestination="@id/dashboardFragment">
<fragment
android:id="@+id/dashboardFragment"
android:name="com.....DashboardFrag"
tools:layout="@layout/fg_dashboard">
<argument
android:name="CONTINUE_REGISTRATION"
android:defaultValue="false"
app:argType="boolean" />
<action
android:id="@+id/continueRegistration"
app:destination="@id/registration_graph" />
</fragment>
</navigation>
<!-- Child Graph -->
<navigation
android:id="@+id/registration_graph"
app:startDestination="@id/opRegFragment">
<fragment
android:id="@+id/opRegFragment"
android:name="com.....RegFieldsFragment"
tools:layout="@layout/fg_registration">
</fragment>
</navigation>
</navigation>
现在在 Dashboard Fragment 中执行以下操作。
class DashboardFrag : BaseFrag {
private var continueReg: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
DashboardFragArgs.fromBundle(requireArguments()).apply {
continueReg = CONTINUEREGISTRATION
}
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
if (continueReg) {
registrationContinueAction()
}
}
private fun registrationContinueAction() {
val action = DashboardFragDirections.continueRegistration()
findNavController().navigate(action)
}
}
编辑 1:
根据您的评论,您也可以将打开的新片段作为单独图表的一部分移动。在下面应该可以工作。
主要nav_graph.xml
<!-- Parent Graph -->
<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/nav_graph"
app:startDestination="@id/landingFragment">
<!-- Landing Child Graph -->
<navigation
android:id="@+id/landingFragment"
app:startDestination="@id/dashboardFragment">
<fragment
android:id="@+id/dashboardFragment"
android:name="com.....DashboardFrag"
tools:layout="@layout/fg_dashboard">
<argument
android:name="CONTINUE_REGISTRATION"
android:defaultValue="false"
app:argType="boolean" />
<action
android:id="@+id/continueRegistration"
app:destination="@id/registration_graph" />
</fragment>
</navigation>
</navigation>
现在在新图表中 (sub_nav_graph.xml)
<?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/sub_nav_graph"
app:startDestination="@id/SubGraphLangingFg">
<fragment android:id="@+id/SubGraphLangingFg"
android:name="com....SubGraphFirstFg"
android:label="fragment_landingsub_fg"
tools:layout="@layout/fragment_landingsub_fg">
</fragment>
</navigation>
而现在,最好有一个新的Activity来处理这个流程下的所有子片段。同样,这取决于要求和可行性。
在Manifest.xml中,注册新的Activity
<activity android:name="com.....ChildGraphLandingActivity" />
而新的 Activity 将是:
class ChildGraphLandingActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_subgraph)
}
}
activity_subgraph.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.....ChildGraphLandingActivity">
<fragment
android:id="@+id/fragment_container"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/sub_nav_graph" />
</FrameLayout>
现在在调用片段中,下面应该完成。
class DashboardFrag : BaseFrag {
......
private fun registrationContinueAction() {
//If you are expecting a call back
startActivityForResult(Intent(context, ChildGraphLandingActivity::class.java)....)
//If call back is not expected
startActivity(Intent(context, ChildGraphLandingActivity::class.java))
}
}
我正在使用 Firebase Dynamic links 与其他用户共享特定产品。我能够创建产品共享 link。 link 生成良好。我在主登录 activity 中检测到 link,它是应用程序的启动器 activity。
link 也被检测到。我有 2 个导航图。一个用于登录过程,一个用于主应用程序。我必须从登录图中打开主图中的特定片段。我正在检测登录图中的 link 并创建一个深度 link,如下所示:
navController.createDeepLink()
.setComponentName(MainActivity::class.java)
.setGraph(R.navigation.nav_graph_main)
.setDestination(R.id.storeFragment)
.setArguments(bundle)
.createPendingIntent()
.send()
问题是,当我打开 storeFragment 时,应用会跳转到 nav_graph_main 的主页片段。它不会停留在 newFragment。只是一瞬间。
我的nav_graph_main如下:
<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/nav_graph_main"
app:startDestination="@id/homeFragment">
...other fragments
<fragment
android:id="@+id/storeFragment"
android:name="in.indiahaat.feature.main.home.store_screen.StoreFragment"
android:label="fragment_store"
tools:layout="@layout/fragment_store" >
<action
android:id="@+id/action_storeFragment_pop"
app:popUpTo="@id/storeFragment"
app:popUpToInclusive="true" />
<action
android:id="@+id/storeFragment_to_reportRetailerFragment"
app:popUpTo="@id/reportRetailerFragment"
app:destination="@id/reportRetailerFragment" />
</fragment>
...other fragments
</navigation>
请post解决这个问题,因为我已经坚持了一段时间了。
我有一种类似的方法可以根据条件重定向到不同的片段。但情况不同。
我不得不根据登录用户的类型和注册状态重定向到不同的片段。使用子导航也可以。
为此,我必须将 data/condition 发送到着陆片段。基于此数据重定向是可能的。
您的场景也可以尝试类似的方法。
NOTE: Although the below did not included Firebase and corresponding dependencies.
<!-- Parent Graph -->
<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/nav_graph"
app:startDestination="@id/landingFragment">
<!-- Landing Child Graph -->
<navigation
android:id="@+id/landingFragment"
app:startDestination="@id/dashboardFragment">
<fragment
android:id="@+id/dashboardFragment"
android:name="com.....DashboardFrag"
tools:layout="@layout/fg_dashboard">
<argument
android:name="CONTINUE_REGISTRATION"
android:defaultValue="false"
app:argType="boolean" />
<action
android:id="@+id/continueRegistration"
app:destination="@id/registration_graph" />
</fragment>
</navigation>
<!-- Child Graph -->
<navigation
android:id="@+id/registration_graph"
app:startDestination="@id/opRegFragment">
<fragment
android:id="@+id/opRegFragment"
android:name="com.....RegFieldsFragment"
tools:layout="@layout/fg_registration">
</fragment>
</navigation>
</navigation>
现在在 Dashboard Fragment 中执行以下操作。
class DashboardFrag : BaseFrag {
private var continueReg: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
DashboardFragArgs.fromBundle(requireArguments()).apply {
continueReg = CONTINUEREGISTRATION
}
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
if (continueReg) {
registrationContinueAction()
}
}
private fun registrationContinueAction() {
val action = DashboardFragDirections.continueRegistration()
findNavController().navigate(action)
}
}
编辑 1:
根据您的评论,您也可以将打开的新片段作为单独图表的一部分移动。在下面应该可以工作。
主要nav_graph.xml
<!-- Parent Graph -->
<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/nav_graph"
app:startDestination="@id/landingFragment">
<!-- Landing Child Graph -->
<navigation
android:id="@+id/landingFragment"
app:startDestination="@id/dashboardFragment">
<fragment
android:id="@+id/dashboardFragment"
android:name="com.....DashboardFrag"
tools:layout="@layout/fg_dashboard">
<argument
android:name="CONTINUE_REGISTRATION"
android:defaultValue="false"
app:argType="boolean" />
<action
android:id="@+id/continueRegistration"
app:destination="@id/registration_graph" />
</fragment>
</navigation>
</navigation>
现在在新图表中 (sub_nav_graph.xml)
<?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/sub_nav_graph"
app:startDestination="@id/SubGraphLangingFg">
<fragment android:id="@+id/SubGraphLangingFg"
android:name="com....SubGraphFirstFg"
android:label="fragment_landingsub_fg"
tools:layout="@layout/fragment_landingsub_fg">
</fragment>
</navigation>
而现在,最好有一个新的Activity来处理这个流程下的所有子片段。同样,这取决于要求和可行性。
在Manifest.xml中,注册新的Activity
<activity android:name="com.....ChildGraphLandingActivity" />
而新的 Activity 将是:
class ChildGraphLandingActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_subgraph)
}
}
activity_subgraph.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.....ChildGraphLandingActivity">
<fragment
android:id="@+id/fragment_container"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/sub_nav_graph" />
</FrameLayout>
现在在调用片段中,下面应该完成。
class DashboardFrag : BaseFrag {
......
private fun registrationContinueAction() {
//If you are expecting a call back
startActivityForResult(Intent(context, ChildGraphLandingActivity::class.java)....)
//If call back is not expected
startActivity(Intent(context, ChildGraphLandingActivity::class.java))
}
}