web-dev-qa-db-ja.com

ナビゲーションコンポーネントを使用した特定のフラグメントのカスタム「上に移動」動作

ナビゲーションコンポーネントを使用して、フラグメントからカスタムアップナビゲーションを追加したい

私のbuild.gradle(app)では、androidx.appcompat:appcompat:1.1.0-alpha04依存関係は、アクティビティからonBackPressedDispatcherにアクセスできます。

だから私は自分のフラグメントにOnBackPressedCallbackを実装し、ディスパッチャーへのコールバックを登録しました:

requireActivity().onBackPressedDispatcher.addCallback(this)

ツールバーでnavigate upを押すとそれが呼び出されると期待していましたが、そうではありません。デバイスの戻るボタンを押すと、期待どおりに呼び出されます。

上に移動するアクションでフラグメントにコールバックを追加する同様の方法はありますか?

[〜#〜]更新[〜#〜]

オーバーライドされたメソッドonOptionsItemSelectedおよびonSupportNavigateUpは、ツールバーの上ボタンを押しても呼び出されません

16
Roko Spark

解決策を見つけた

handleOnBackPressed()メソッドは、デバイスの戻るボタンをクリックしたときにのみ呼び出されます。 onOptionsItemSelected()onSupportNavigateUp()のどちらのメソッドも、ツールバーの「上ボタン」を押しても呼び出されなかったのはなぜですか。そして答えは私が使った

NavigationUI.setupWithNavController(toolbar, navController, appBarConfiguration)

ナビゲーションコンポーネントを備えたツールバーをセットアップするアクティビティ。また、内部的にナビゲーションを操作するためにツールバーが応答可能になり、「上ボタン」を押しても、アクティビティまたはフラグメントのオーバーライドされたメソッドが呼び出されませんでした。

代わりに使用する必要があります

NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration)

これにより、ナビゲーションに対してactionBarが応答するようになるため、オーバーライドされた関数onOptionsItemSelected()およびonSupportNavigateUp()を使用できます。また、特定の画面の「上ボタン」クリックでカスタム動作を追加するのに最適な場所(私の場合)は次のとおりです。

onSupportNavigateUp()

そのようなホストされた活動の

override fun onSupportNavigateUp(): Boolean {
        val navController = this.findNavController(R.id.mainNavHostFragment)
        return when(navController.currentDestination?.id) {
            R.id.destinationOfInterest -> {
                // custom behavior here 
                true
            }
            else -> navController.navigateUp()
        }
}

ただし、カスタム動作をフラグメントで直接実装する場合は、@ Enzokieの回答が魅力のように機能することをお伝えしておきます

10
Roko Spark

onBackPressedDispatcherプロパティからonBackPressed()を呼び出す必要があります。ツールバーが適切に設定されていると仮定すると、アクティビティで以下のコードを使用できます。

_override fun onOptionsItemSelected(menuItem : MenuItem?) : Boolean {
    if (menuItem.getItemId() == Android.R.id.home) {
        onBackPressedDispatcher.onBackPressed()
    }
    return super.onOptionsItemSelected(menuItem)
}
_

これは何ですか:

現在追加されているOnBackPressedCallbackコールバックの呼び出しを、追加された順序とは逆の順序でトリガーします。そのOnBackPressedCallback#handleOnBackPressed()からのfalseが最も多い場合にのみ、以前に追加されたコールバックが呼び出されます。

私の例ではAndroidXを使用しているため、インポートは次のようになります

_import androidx.appcompat.app.AppCompatActivity_。

5
Enzokie

この設定も機能し、アクティビティでonSupportNavigateUpをオーバーライドする必要はありません。

NavigationUI.setupWithNavController(toolbar, navController, appBarConfiguration)
toolbar.setNavigationOnClickListener {
    if (navController.currentDestination?.id == R.id.destinationOfInterest) {
        // Custom behavior here
    } else {
        NavigationUI.navigateUp(navController, configuration)
    }
}

Toolbarを設定することをお勧めします。これは、上方向のナビゲーションを自動的に処理し、DrawerLayoutがある場合はそれを開閉します。

0
Juan Cruz Soler