いくつかの提案が必要です。
ナビゲーションライブラリを実験しています。 webViewを持つフラグメントがあります。私はそれがcanGoBack
であるかどうかをチェックし、可能であればそうしたいのですが、そうでなければ干渉しません。
1。インターフェイスアプローチ:ナビゲーションがトランザクションを処理しているため、フラグメントのインスタンスを手動で作成する必要がなくなりました。アクティビティのリスナーとして割り当てることができます。
1。主なリスニング:見た目は醜く、一般的な解決策ではないと思うので、これはスキップします。
ナビゲーションライブラリでどのように実行できるかについて、いくつかの意見が必要です。 currentDestination
からnavController
を取得しようとすると、xmlで指定されたラベルなど、現在のフラグメントに関する情報を提供するNavigationDestination
オブジェクトです。
fragmentManager
を検査すると、backStack
が空で、タグなしでフラグメントトランザクションが実行されていることがわかります。
私見それは、現在のフラグメントといくらか相互作用するためにfindFragment
の種類の操作を行うためのライブラリの概念に適合しませんが、現時点ではそれを通り抜ける方法を見つけることができないようです。助言がありますか ?
以前と同じように、インターフェイスまたは基本フラグメントクラスでそれを行う方法を見つけました。
活動中:
override fun onBackPressed() {
val f = currentFragment
if (f !is BaseFragment || f.onBackPressed()) {
if (!findNavController(R.id.nav_Host_fragment).navigateUp()) {
super.onBackPressed()
}
}
}
val currentFragment: Fragment?
get() = nav_Host_fragment.childFragmentManager.findFragmentById(R.id.nav_Host_fragment)
baseFragment内:
open fun onBackPressed() = true /*or false if you want to prevent navigation*/
OnBackPressedCallback これに使用できます:
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
activity?.addOnBackPressedCallback {
Log.d(TAG, "handleOnBackPressed")
//Your custom back behaviour
return@addOnBackPressedCallback false
}
}
デフォルトのバック動作を実行する場合は、false
を返します。無視するにはtrue
を返します。
任意のフラグメントからOnBackPressedを直接処理できます
requireActivity().onBackPressedDispatcher
.addCallback(viewLifecycleOwner, object: OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
//Handle back event from any fragment
}
})
上記のコードをonViewCreatedに配置します