ナビゲーションコンポーネントを使用して、フラグメントからカスタムアップナビゲーションを追加したい
私のbuild.gradle(app)
では、androidx.appcompat:appcompat:1.1.0-alpha04
依存関係は、アクティビティからonBackPressedDispatcher
にアクセスできます。
だから私は自分のフラグメントにOnBackPressedCallback
を実装し、ディスパッチャーへのコールバックを登録しました:
requireActivity().onBackPressedDispatcher.addCallback(this)
ツールバーでnavigate upを押すとそれが呼び出されると期待していましたが、そうではありません。デバイスの戻るボタンを押すと、期待どおりに呼び出されます。
上に移動するアクションでフラグメントにコールバックを追加する同様の方法はありますか?
[〜#〜]更新[〜#〜]
オーバーライドされたメソッドonOptionsItemSelected
およびonSupportNavigateUp
は、ツールバーの上ボタンを押しても呼び出されません
解決策を見つけた
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の回答が魅力のように機能することをお伝えしておきます
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
_。
この設定も機能し、アクティビティで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
がある場合はそれを開閉します。