Guest User

Untitled

a guest
Oct 23rd, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.96 KB | None | 0 0
  1. package com.lundibundi.example
  2.  
  3. import android.content.Context
  4. import android.os.Bundle
  5. import android.util.AttributeSet
  6. import androidx.annotation.IdRes
  7. import androidx.fragment.app.DialogFragment
  8. import androidx.fragment.app.FragmentManager
  9. import androidx.navigation.NavDestination
  10. import androidx.navigation.NavOptions
  11. import androidx.navigation.Navigator
  12. import com.lundibundi.example.R
  13.  
  14. @Navigator.Name("dialog_fragment")
  15. class DialogFragmentNavigator(
  16. private val fragmentManager: FragmentManager
  17. ) : Navigator<DialogFragmentDestination>() {
  18.  
  19. override fun navigate(destination: DialogFragmentDestination, args: Bundle?, navOptions: NavOptions?, navigatorExtras: Extras?) {
  20. val manager = (navigatorExtras as? DialogNavigatorExtras)?.parentFragmentManager ?: fragmentManager
  21. val ft = manager.beginTransaction()
  22.  
  23. val fragment = destination.createFragment(args)
  24.  
  25. var enterAnim = navOptions?.enterAnim ?: -1
  26. var exitAnim = navOptions?.exitAnim ?: -1
  27. var popEnterAnim = navOptions?.popEnterAnim ?: -1
  28. var popExitAnim = navOptions?.popExitAnim ?: -1
  29. if (enterAnim != -1 || exitAnim != -1 || popEnterAnim != -1 || popExitAnim != -1) {
  30. enterAnim = if (enterAnim != -1) enterAnim else 0
  31. exitAnim = if (exitAnim != -1) exitAnim else 0
  32. popEnterAnim = if (popEnterAnim != -1) popEnterAnim else 0
  33. popExitAnim = if (popExitAnim != -1) popExitAnim else 0
  34. ft.setCustomAnimations(enterAnim, exitAnim, popEnterAnim, popExitAnim)
  35. }
  36.  
  37. if (navOptions != null && navOptions.shouldLaunchSingleTop()) {
  38. throw RuntimeException("SingleTop is not supported")
  39. }
  40.  
  41. @IdRes val destId = destination.id
  42. fragment.show(ft, DIALOG_TAG)
  43. dispatchOnNavigatorNavigated(destId, BACK_STACK_UNCHANGED)
  44. }
  45.  
  46. override fun createDestination(): DialogFragmentDestination = DialogFragmentDestination(this)
  47.  
  48. override fun popBackStack(): Boolean = true
  49.  
  50. companion object {
  51. const val DIALOG_TAG = "dialogTag"
  52. }
  53. }
  54.  
  55. class DialogFragmentDestination(navigator: Navigator<out NavDestination>) : NavDestination(navigator) {
  56. private var fragmentClass: Class<out DialogFragment>? = null
  57.  
  58. override fun onInflate(context: Context, attrs: AttributeSet) {
  59. super.onInflate(context, attrs)
  60. val a = context.resources.obtainAttributes(attrs, R.styleable.FragmentNavigator)
  61. a.getString(R.styleable.FragmentNavigator_android_name)?.let { className ->
  62. fragmentClass = parseClassFromName(context, className, DialogFragment::class.java)
  63. }
  64. a.recycle()
  65. }
  66.  
  67. fun createFragment(args: Bundle?): DialogFragment {
  68. val clazz = fragmentClass ?: throw IllegalStateException("fragment class not set")
  69. return clazz.newInstance().also { fragment ->
  70. args?.let { fragment.arguments = it }
  71. }
  72. }
  73. }
  74.  
  75. data class DialogNavigatorExtras(val parentFragmentManager: FragmentManager) : Navigator.Extras
Add Comment
Please, Sign In to add comment