単一のアクティビティを作成しようとしていますAndroidアプリケーション。BottomNavigationView、3つのトップレベルフラグメント、およびいくつかの子フラグメントを持つMainActivity(アクティビティのみ)があります。画面にトップレベルが表示されているときは常に要件が必要ですフラグメント、下部ナビゲーションは切り替えが可能なように表示される必要があります。ただし、子フラグメントを表示しているときは、下部ナビゲーションを非表示にする必要があります。Navigationコンポーネントを使用してすぐに使用できる方法があるか、または可視性を変更する必要があります手動で?
AddOnDestinationChangedListenerを使用すると機能します。これは公式ドキュメントで推奨されている解決策ですが、フラグメントが添付される前にコールバックが実行されるため、ちらつきが発生します。
私は以下の答えがより柔軟で、アニメーションをよりうまく処理できると思います:
supportFragmentManager.registerFragmentLifecycleCallbacks(object : FragmentManager.FragmentLifecycleCallbacks() {
override fun onFragmentViewCreated(fm: FragmentManager, f: Fragment, v: View, savedInstanceState: Bundle?) {
TransitionManager.beginDelayedTransition(binding.root, Slide(Gravity.BOTTOM).excludeTarget(R.id.nav_Host_fragment, true))
when (f) {
is ModalFragment -> {
binding.bottomNavigation.visibility = View.GONE
}
else -> {
binding.bottomNavigation.visibility = View.VISIBLE
}
}
}
}, true)
フラグメント間の遷移に応じて、別のアニメーション(この例ではスライド)を選択するか、別のライフサイクルコールバックで呼び出しを行うことにより、カスタマイズできます。
このコードをMainActivity
に書くだけです
class MainActivity : AppCompatActivity() {
private lateinit var navController: NavController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//Getting the Navigation Controller
navController = Navigation.findNavController(this, R.id.fragment)
//Setting the navigation controller to Bottom Nav
bottomNav.setupWithNavController(navController)
//Setting up the action bar
NavigationUI.setupActionBarWithNavController(this, navController)
//setting the Bottom navigation visibiliy
navController.addOnDestinationChangedListener { _, destination, _ ->
if(destination.id == R.id.full_screen_destination ){
bottomNav.visibility = View.GONE
}else{
bottomNav.visibility = View.VISIBLE
}
}
}
Android開発者ドキュメント: NavigationUIを使用してUIコンポーネントを更新する から詳細を取得します)==