В моем приложении у меня есть OptionsMenu, которое используется многими фрагментами.Поэтому я создал следующий BaseFragment:
abstract class BaseFragment : Fragment() {
private lateinit var navController: NavController
protected fun askForPermissions(permissionRequestCode: Int, vararg permissions: String) {
requestPermissions(permissions, permissionRequestCode)
}
protected fun checkPermission(permission: String, activity: Activity): Boolean = when {
Build.VERSION.SDK_INT < Build.VERSION_CODES.M -> true // It is not needed at all as there were no runtime permissions yet
else -> ContextCompat.checkSelfPermission(activity, permission) == PackageManager.PERMISSION_GRANTED
}
override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
inflater!!.inflate(R.menu.menu_topbar, menu)
@SuppressLint("RestrictedApi")
if (menu is MenuBuilder) {
menu.setOptionalIconsVisible(true)
}
super.onCreateOptionsMenu(menu, inflater)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
navController = Navigation.findNavController(view!!)
return when (item.itemId) {
R.id.menu_topbar_profile -> {
navController.navigate(actionBaseToProfile())
true
}
R.id.menu_topbar_favorites -> {
navController.navigate(actionBaseToFavorites())
true
}
R.id.menu_topbar_help -> {
navController.navigate(actionBaseToHelp())
true
}
else -> false
}
}
}
И в навигационном файле я добавил BaseFragment и целевые фрагменты.Вот фрагмент кода:
<fragment
android:id="@+id/fragment_base"
android:name="com.test.scanner.base.BaseFragment">
<action
android:id="@+id/action_base_to_profile"
app:destination="@id/fragment_profile" />
</fragment>
<fragment
android:id="@+id/fragment_profile"
android:name="com.test.scanner.ui.profile.ProfileFragment"
tools:layout="@layout/fragment_profile" />
Как видите, я не определил макет для BaseFragment, потому что его нет.Я всегда получаю IllegalArgumentException, если я хочу перейти к определенному экрану (например, ProfileFragment), нажав на элемент OptionsMenu.Вот исключение:
java.lang.IllegalArgumentException: navigation destination com.test.scanner.debug:id/action_base_to_profile is unknown to this NavController
Как мы можем использовать компонент навигации внутри BaseFragment.Возможно ли это вообще или есть другое решение для этого случая?