BottomNavigationViewを介したトップレベルナビゲーション用の3つのフラグメントを持つ小さなアプリを作成しました。アプリを起動して、下部のナビゲーションのナビゲーションボタンをクリックすると、アクションバーに上ボタンが表示されます。アクティビティのコードは次のとおりです。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
setSupportActionBar(toolbar)
val navController = navHostFragment.findNavController()
setupActionBarWithNavController(this, navController)
setupWithNavController(bottomNav, navController)
}
override fun onSupportNavigateUp(): Boolean
= findNavController(navHostFragment).navigateUp()
}
これが結果のスクリーンショットです。アプリはホーム画面で起動し、BottomNavigationViewからプロフィールボタンをクリックするだけで済みます。
私はBottomNavigationViewのアイテム選択を聞いて、手動でさまざまな NavOptions を使用してナビゲートしてみましたが、役に立ちませんでした。ユーザーがBottomNavigationViewで移動しているときにアクションバーに上ボタンを表示しないようにするためにできることはありますか?
1.0.0-alpha07以降、AppBarConfiguration
を使用してその動作を構成できます。
AppBarConfiguration
にはBuilderコンストラクターがあるため、Builder
によって参照されるトップレベルの宛先の特定のセットで新しいid
を作成できます(このid
はナビゲーションレイアウトで設定したもの)。
新しいAppBarConfiguration
を作成:
_val appBarConfiguration = AppBarConfiguration
.Builder(
R.id.navigationHomeFragment,
R.id.navigationListFragment,
R.id.navigationProfileFragment)
.build()
_
次に、setupActionBarWithNavController(this, navController)
の代わりにsetupActionBarWithNavController(this, navController, appBarConfiguration)
を呼び出す必要があります
これは、上位のナビゲーション動作を処理する正しい方法です。
同じ問題があり、NavController.addOnNavigatedListenerを使用して現在のフラグメントを取得する方法を見つけたので、次のロジックをアクティビティ内に適用し、今それは私のために働きます
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_home)
val navHost = supportFragmentManager
.findFragmentById(R.id.navHostFragment) as NavHostFragment
navHost.navController.addOnNavigatedListener { _, destination ->
val showButton = showUpButton(destination.id)
//Here occurs the magic
supportActionBar?.setDisplayShowHomeEnabled(showButton)
supportActionBar?.setDisplayHomeAsUpEnabled(showButton)
}
}
//Check according to your convenience which fragment id
//should show or hide the "Up Button"
private fun showUpButton(id: Int): Boolean {
return id != R.id.your_home_fragment && id != R.id.your_list_fragment
&& id != R.id.your_profile_fragment
}
そして、これは私のプロジェクトです...
それが最善の選択肢かどうかはわかりませんが、誰かより良い提案があれば、それは歓迎されます
setupWithNavController
の代わりにこれを使用してください:
navController.addOnNavigatedListener(new NavController.OnNavigatedListener() {
@Override
public void onNavigated(@NonNull NavController controller, @NonNull NavDestination destination) {
toolbar.setTitle(destination.getLabel());
}
});
または、Kotlinの同等のもの。
setupWithNavController
が行う唯一のことは、ツールバーのタイトルを変更するリスナーを追加し、上ボタンを作成することです。上ボタンが不要な場合は、ツールバーのタイトルのみを変更するリスナーを追加します。
NavigationUI.setupWithNavController
を使用している場合 onNavDestinationSelected
を確認してください。
下部のナビゲーションビューmenu.xml
内で、対応するMenuItem
にAndroid:menuCategory="secondary"
を追加します。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item
Android:id="@+id/profileFragment"
Android:icon="@drawable/bottom_nav_icon_profile"
Android:menuCategory="secondary"
Android:title="@string/profile" />