Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.lundibundi.example
- import android.content.Context
- import android.os.Bundle
- import android.util.AttributeSet
- import androidx.annotation.IdRes
- import androidx.fragment.app.DialogFragment
- import androidx.fragment.app.FragmentManager
- import androidx.navigation.NavDestination
- import androidx.navigation.NavOptions
- import androidx.navigation.Navigator
- import com.lundibundi.example.R
- @Navigator.Name("dialog_fragment")
- class DialogFragmentNavigator(
- private val fragmentManager: FragmentManager
- ) : Navigator<DialogFragmentDestination>() {
- override fun navigate(destination: DialogFragmentDestination, args: Bundle?, navOptions: NavOptions?, navigatorExtras: Extras?) {
- val manager = (navigatorExtras as? DialogNavigatorExtras)?.parentFragmentManager ?: fragmentManager
- val ft = manager.beginTransaction()
- val fragment = destination.createFragment(args)
- var enterAnim = navOptions?.enterAnim ?: -1
- var exitAnim = navOptions?.exitAnim ?: -1
- var popEnterAnim = navOptions?.popEnterAnim ?: -1
- var popExitAnim = navOptions?.popExitAnim ?: -1
- if (enterAnim != -1 || exitAnim != -1 || popEnterAnim != -1 || popExitAnim != -1) {
- enterAnim = if (enterAnim != -1) enterAnim else 0
- exitAnim = if (exitAnim != -1) exitAnim else 0
- popEnterAnim = if (popEnterAnim != -1) popEnterAnim else 0
- popExitAnim = if (popExitAnim != -1) popExitAnim else 0
- ft.setCustomAnimations(enterAnim, exitAnim, popEnterAnim, popExitAnim)
- }
- if (navOptions != null && navOptions.shouldLaunchSingleTop()) {
- throw RuntimeException("SingleTop is not supported")
- }
- @IdRes val destId = destination.id
- fragment.show(ft, DIALOG_TAG)
- dispatchOnNavigatorNavigated(destId, BACK_STACK_UNCHANGED)
- }
- override fun createDestination(): DialogFragmentDestination = DialogFragmentDestination(this)
- override fun popBackStack(): Boolean = true
- companion object {
- const val DIALOG_TAG = "dialogTag"
- }
- }
- class DialogFragmentDestination(navigator: Navigator<out NavDestination>) : NavDestination(navigator) {
- private var fragmentClass: Class<out DialogFragment>? = null
- override fun onInflate(context: Context, attrs: AttributeSet) {
- super.onInflate(context, attrs)
- val a = context.resources.obtainAttributes(attrs, R.styleable.FragmentNavigator)
- a.getString(R.styleable.FragmentNavigator_android_name)?.let { className ->
- fragmentClass = parseClassFromName(context, className, DialogFragment::class.java)
- }
- a.recycle()
- }
- fun createFragment(args: Bundle?): DialogFragment {
- val clazz = fragmentClass ?: throw IllegalStateException("fragment class not set")
- return clazz.newInstance().also { fragment ->
- args?.let { fragment.arguments = it }
- }
- }
- }
- data class DialogNavigatorExtras(val parentFragmentManager: FragmentManager) : Navigator.Extras
Add Comment
Please, Sign In to add comment