Использование компонента навигации внутри BaseFragment - PullRequest
0 голосов
/ 25 июня 2019

В моем приложении у меня есть 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.Возможно ли это вообще или есть другое решение для этого случая?

1 Ответ

3 голосов
/ 03 июля 2019

Вы смешиваете вещи. Не помещайте класс abstract в свой граф навигации, но только классы, которые расширяют этот класс BaseFragment в вашем случае. Я бы посоветовал вам начать с этого урока навигационная архитектура-компоненты и, как только вы закончите, попробуйте прочитать больше об абстрактных классах, а затем упростить решение из этой статьи. Когда вы закончите, попробуйте добавить меню, но не помещайте его в baseFragment, а вставьте другое меню в каждый фрагмент, используя только одно действие для следующего фрагмента. Это будет проще После того, как вы обернетесь вокруг него, добавьте новые вещи, такие как кнопки.

...