如果出于某些原因您想要导航到特定的片段(而不是星形片段),并且您有一个活动的两个图表,这是我建议的方法:
此方法将启动活动。
companion object {
const val REQUEST_OR_CONFIRM = "request_or_confirm"
const val IS_JUST_VIEW = "IS_JUST_VIEW"
const val MODEL = "model"
fun open(activity: Activity, isRequestOrConfirm: Boolean, isJustView: Boolean = false, model: DataModel? = null) {
val intent = Intent(activity, HostActivity::class.java)
intent.putExtra(REQUEST_OR_CONFIRM, isRequestOrConfirm)
intent.putExtra(IS_JUST_VIEW, isJustView)
intent.putExtra(MODEL, model)
activity.startActivity(intent)
}
}
在主活动的onCreate方法中,首先决定使用哪个图形,然后传递意图附加信息包,以便启动片段可以决定要做什么:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_purchase_nav)
if (intent.getBooleanExtra(REQUEST_OR_CONFIRM, true)) {
findNavController(R.id.nav_host_fragment).setGraph(R.navigation.nav_first_scenario, intent.extras)
} else {
findNavController(R.id.nav_host_fragment).setGraph(R.navigation.nav_second_scenario, intent.extras)
}
}
以下是如何在起始片段中决定要执行的操作:
if (arguments != null && arguments!!.getBoolean(HostActivity.IS_JUST_VIEW)){
navigateToYourDestinationFrag(arguments!!.getParcelable<DataModel>(HostActivity.MODEL))
}
然后像平常一样导航:
private fun navigateToYourDestinationFrag(model: DataModel) {
val action = StartFragmentDirections.actionStartFragmentToOtherFragment(model)
findNavController().navigate(action)
}
如果您想从一开始就跳转到第三个片段,您的图表可能如下所示:
![enter image description here](https://istack.dev59.com/M0UGk.webp)
附注:请确保在第三个片段上处理返回按钮,这里有一个解决方案
更新:
正如EpicPandaForce所提到的那样,您也可以使用导航组件启动活动:
要做到这一点,首先将活动添加到现有的图表中,可以通过+图标(对我无效)或手动在xml中添加来完成:
<activity
android:id="@+id/secondActivity"
tools:layout="@layout/activity_second"
android:name="com.amin.SecondActivity" >
</activity>
您还可以添加参数,并像在片段中一样使用它们,使用navArgs()。
<activity
android:id="@+id/secondActivity"
tools:layout="@layout/activity_second"
android:name="com.amin.SecondActivity" >
<argument
android:name="testArgument"
app:argType="string"
android:defaultValue="helloWorld" />
</activity>
在 Kotlin 中,以下是如何使用参数的方法。首先,在你的活动类顶部声明 args 变量,变量类型为以你的活动命名的生成类,例如本例中的 SecondActivityArgs:
val args: SecondActivityArgsby by navArgs()
然后你可以像这样使用它:
print(args.testArgument)
Navigation.setViewNavController(fabAdd, navController)
- 只有在你想使用fabAdd.findNavController()
时才需要它(而且,由于你已经有了对NavController
的引用,这是你永远不需要做的事情)。 - ianhanniballake