Navigation Architecture Componentで現在アクティブなFragmentか判定する方法

1 min read読了の目安(約1100字

Navigation Architecture Componentでイベントの中で画面遷移処理行う場合に、
ダイアログの裏側のFragmentが反応してしまい、backStackがおかしくなることが頻発したため、
自身がアクティブなFragmentか判定するために、extensionを書いたのでメモしておきます。

サンプルコード

Fragment.kt
package com.example.extension

import androidx.fragment.app.Fragment
import androidx.navigation.NavDestination
import androidx.navigation.fragment.DialogFragmentNavigator
import androidx.navigation.fragment.FragmentNavigator
import androidx.navigation.fragment.findNavController

/**
 * isCurrentDestination
 */
fun Fragment.isCurrentDestination(): Boolean {
  val currentDestination: NavDestination = findNavController().currentDestination ?: return false
  when (currentDestination) {
    is DialogFragmentNavigator.Destination -> {
      if (currentDestination.className == this.javaClass.name) {
        return true
      }
    }
    is FragmentNavigator.Destination -> {
      if (currentDestination.className == this.javaClass.name) {
        return true
      }
    }
  }
  return false
}

使用例

  /**
   * 戻るボタンクリック処理
   */
  fun onClickBackButton() {
    if (!isCurrentDestination()) {
      return
    }
    findNavController().popBackStack()
  }