我不知道如何使用新的导航体系结构组件从我的主屏幕(将myComboBox.SelectedValue = valueYouWant
附加到FloatingActionButton
)导航到另一屏幕无应用栏。
当我单击晶圆厂时,我希望我的下一个屏幕(碎片?)从右侧滑入。问题是我应该将BottomAppBar
放在哪里?如果我将其放在BottomAppBar
中,则会遇到MainActivity
没有设置FloatingActionButton
的问题。我也无法将NavController
放入片段中。我很茫然。
答案 0 :(得分:3)
您可以将BottomAppBar
放在MainActivity
中,并按如下所示访问片段中的FloatingActionButton
activity?.fab?.setOnClickListener {
/*...*/
findNavController().navigate(R.id.action_firstFragment_to_secondFragment, mDataBundle)
}
您可以按照以下步骤在其他活动中隐藏BottomAppBar
(activity as AppCompatActivity).supportActionBar?.hide()
在返回上一个片段时,请确保您.show()
BottomAppBar
答案 1 :(得分:1)
今天遇到了这个问题,我发现有一个简单而优雅的解决方案。
val navController = findNavController(R.id.navHostFragment)
Navigation.setViewNavController(fabAdd, navController)
fabAdd.setOnClickListener {
navController.navigate(R.id.addSymbolFragment)
}
这将照顾导航。然后,您必须控制BottomAppBar
内部Activity
的可见性。
答案 2 :(得分:0)
将其放在MainActivity中,并将setOnClickListener置于活动的onStart()
中,它将正常工作。
override fun onStart() {
super.onStart()
floatingActionButton.setOnClickListener {
it.findNavController().navigate(R.id.yourFragment)
}
}
注意:此解决方案就像hack一样,最好在活动准备好进行交互时遵循Activity LifeCycle和setUp OnClickListener。
答案 3 :(得分:0)
如果出于某种原因您想在开始时导航到某个片段(而不是星形片段),并且还必须为一个活动绘制图表,这是我的建议: 该方法将开始活动
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)
}
}
然后在Host Activity的onCreate方法中,首先确定要使用的图形,然后传递Intent Extras捆绑包,以便起始片段可以确定要执行的操作:
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)
}
PS:请确保您将处理第三个片段上的后退按钮,here是解决方案
更新: 如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>
在koltin中,这是您将如何使用该参数的方法,首先用活动后命名的生成类的类型声明args,在这种情况下,在活动类的顶部声明SecondActivityArgs:
val args: SecondActivityArgsby by navArgs()
然后您可以像这样使用它:
print(args.testArgument)
答案 4 :(得分:0)
这不会破坏BottomAppBar。仅将此添加到 MainActivity,不要做任何其他事情
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
fabAdd.setOnClickListener {
findNavController(navHostFragment).navigate(R.id.fab)
}