导航到FAB单击上的片段(导航架构组件)

时间:2018-06-28 14:18:26

标签: android android-layout android-fragments android-activity kotlin

我不知道如何使用新的导航体系结构组件从我的主屏幕(将myComboBox.SelectedValue = valueYouWant附加到FloatingActionButton)导航到另一屏幕应用栏。

当我单击晶圆厂时,我希望我的下一个屏幕(碎片?)从右侧滑入。问题是我应该将BottomAppBar放在哪里?如果我将其放在BottomAppBar中,则会遇到MainActivity没有设置FloatingActionButton的问题。我也无法将NavController放入片段中。我很茫然。

5 个答案:

答案 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。

Similar question [SOLVED]

答案 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)
    }

这是您想跳到开头的第三个片段时图形的外观 enter image description here

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)
}