web-dev-qa-db-ja.com

Android新しいナビゲーションコンポーネントでのonBackPressed処理

いくつかの提案が必要です。

ナビゲーションライブラリを実験しています。 webViewを持つフラグメントがあります。私はそれがcanGoBackであるかどうかをチェックし、可能であればそうしたいのですが、そうでなければ干渉しません。

1。インターフェイスアプローチ:ナビゲーションがトランザクションを処理しているため、フラグメントのインスタンスを手動で作成する必要がなくなりました。アクティビティのリスナーとして割り当てることができます。

1。主なリスニング:見た目は醜く、一般的な解決策ではないと思うので、これはスキップします。

ナビゲーションライブラリでどのように実行できるかについて、いくつかの意見が必要です。 currentDestinationからnavControllerを取得しようとすると、xmlで指定されたラベルなど、現在のフラグメントに関する情報を提供するNavigationDestinationオブジェクトです。

fragmentManagerを検査すると、backStackが空で、タグなしでフラグメントトランザクションが実行されていることがわかります。

私見それは、現在のフラグメントといくらか相互作用するためにfindFragmentの種類の操作を行うためのライブラリの概念に適合しませんが、現時点ではそれを通り抜ける方法を見つけることができないようです。助言がありますか ?

13
Mel

以前と同じように、インターフェイスまたは基本フラグメントクラスでそれを行う方法を見つけました。

活動中:

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*/
9
AnoDest

OnBackPressedCallback これに使用できます:

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    activity?.addOnBackPressedCallback {
        Log.d(TAG, "handleOnBackPressed")
        //Your custom back behaviour
        return@addOnBackPressedCallback false
    }
}

デフォルトのバック動作を実行する場合は、falseを返します。無視するにはtrueを返します。

0
Sven

任意のフラグメントからOnBackPressedを直接処理できます

requireActivity().onBackPressedDispatcher
        .addCallback(viewLifecycleOwner, object: OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            //Handle back event from any fragment 
        }
    })

上記のコードをonViewCreatedに配置します

0
Kalpesh Kulye