我的应用程序像向导一样工作。我有一个Activity,可以集中处理所有片段。每个片段中都有一个带有“下一步”按钮的BottomNavigationView,以驱动向导。
当我想下一步时,我从BottomNavMenu调用“action_next”,它导航到下一个片段。
但是当用户在该片段的上下文中按下“下一步”按钮时,我需要执行一些操作(例如存储输入的数据)。此外,如果用户输入的数据有任何问题,我需要取消导航。
首先尝试在片段中执行此操作:
val controller = NavHostFragment.findNavController(this)
controller.addOnNavigatedListener { controller, navDestination: NavDestination ->
when (navDestination.id) {
R.id.destination_setup_tournment -> {
proceedNavigation(controller, navDestination)
}
}
}
private fun proceedNavigation(controller: NavController, navDestination: NavDestination) {
val teams = teamAdapter.getItems()
if (validateSubmit(teams)){
presenter.saveTeams(teams)
}else{
//how to cancel navigation and stay on this fragment?
}
}
但是它对我来说看起来并不好,甚至不正确,如果出现问题,我也不知道如何取消导航。
这是该应用程序的相关文件:
主要 Activity :
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?colorPrimary"
android:theme="@style/ToolbarTheme" />
<fragment
android:id="@+id/nav_host_fragment"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:name="androidx.navigation.fragment.NavHostFragment"
app:navGraph="@navigation/navigation"
app:defaultNavHost="true" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_nav_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
app:menu="@menu/bottom_nav"
style="@style/Widget.MaterialComponents.BottomNavigationView"
>
</com.google.android.material.bottomnavigation.BottomNavigationView>
bottom_nav.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/action_next" android:title="@string/tornment_mode" android:icon="@drawable/ic_navigate_next_black_24dp" />
</menu>
最佳答案
无法“取消”导航事件-您需要将业务逻辑放在按钮/侦听器本身上,并且仅在实际要导航时才调用navigate()
。
Creating event callbacks to the activity documentation通过使用onAttach(Context)
获得对Activity的引用并设置属性,回调等,从而将Activity和Fragment连接在一起的一种方法。
例如,您可以考虑执行以下操作:
// In your Activity
var onNextClicked: () -> Unit = {}
// In your Activity's onCreate()
button.setOnClickListener = View.OnClickListener {
onNextClicked.invoke()
}
// In your Fragment
override fun onAttach(context: Context) {
(context as YourActivity).onNextClicked = {
val teams = teamAdapter.getItems()
if (validateSubmit(teams)){
presenter.saveTeams(teams)
findNavController().navigate(R.id.action_next)
}
}
}
每个片段将设置他们希望下一个按钮执行的操作,从而使您可以完全控制该按钮的操作。
如果您死于在BottomNavigationView上设置而不是仅使用实际的Button,则希望设置自己的
OnNavigationItemSelectedListener
,并在使用此示例的情况下让该侦听器调用onNextClicked
lambda。