我正在尝试创建一个活动的Android应用程序。 我的MainActivity(仅活动)带有BottomNavigationView,三个顶级片段和一些子片段。我的要求是,每当屏幕上显示顶层片段时,底部导航都应该可见,以便可以进行切换。但是,当我查看任何子片段时,应该隐藏底部导航。 是否有使用导航组件的开箱即用的方式,还是需要手动更改可见性?
答案 0 :(得分:16)
更新(导航组件1.0)
从Navigation component 1.0.0-alpha08开始,方法addOnNavigatedListener(controller: NavController, destination: NavDestination)
已更改为addOnDestinationChangedListener(controller: NavController, destination: NavDestination, arguments: Bundle)
。其行为也略有变化(如果destinations参数更改,也将调用它。)
旧答案
您可以使用NavController.OnNavigatedListener实现此行为(在Activity onCreate中进行设置):
findNavController(R.id.container).addOnNavigatedListener { _, destination ->
when (destination.id) {
R.id.dashboardFragment -> showBottomNavigation()
else -> hideBottomNavigation()
}
}
private fun hideBottomNavigation() {
// bottom_navigation is BottomNavigationView
with(bottom_navigation) {
if (visibility == View.VISIBLE && alpha == 1f) {
animate()
.alpha(0f)
.withEndAction { visibility = View.GONE }
.duration = EXIT_DURATION
}
}
}
private fun showBottomNavigation() {
// bottom_navigation is BottomNavigationView
with(bottom_navigation) {
visibility = View.VISIBLE
animate()
.alpha(1f)
.duration = ENTER_DURATION
}
}
答案 1 :(得分:3)
使用addOnDestinationChangedListener可以正常工作,这是官方文档中建议的解决方案,但是由于在片段附加之前执行了回调,因此确实会引起闪烁。
我发现以下答案更加灵活,并且可以更好地处理动画:
input BookmarkInput {
vidId: String!
timestamp: Int!
}
您可以根据片段之间的过渡,选择不同的动画(在我的示例中为幻灯片)或在另一个生命周期回调进行调用来自定义它。
答案 2 :(得分:1)
您必须在MainActivity中创建一个方法以提高可见性。请从要显示或隐藏的片段中调用该方法。
我遇到这种情况的一件事是,底部导航的可见性没有正确消失。因此,我将底部导航视图置于相对布局中,并隐藏了该父视图。
答案 3 :(得分:0)
您只需要在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开发人员文档中获取更多详细信息: Update UI components with NavigationUI
答案 4 :(得分:0)
因此,即使已经回答了这个问题,并且可以接受的答案也是可行的,但以下是实际实现此行为的代码:
fun hideBottomNav() {
bottomNavigationView.visibility = View.GONE
}
fun showBottomNav() {
bottomNavigationView.visibility = View.VISIBLE
}
然后,您调用片段onViewCreated()
,onDetach()
函数中的函数,例如:
class FragmentWithOutBottomNav() : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
(activity as MainActivity).hideBottomNav()
}
override fun onDetach() {
super.onDetach()
(activity as MainActivity).showBottomNav()
}
}
希望我能帮助一些人。编码愉快!