单Activity设计时如何隐藏底栏导航?
How to Hide Bottom Bar Nav.. When following single Activity design?
我试图仅在几个片段中显示底部栏导航(即,为我的大部分片段隐藏它)..
我读了 official document about this, but it unclear to me, like where do I put the code, and I read ,比如“我很惊讶文档中有这样的建议,因为它实际上看起来很糟糕,因为侦听器会在新片段放置在屏幕上之前触发,导致可见的闪烁(有时存在,有时不存在)”。
我对此进行了研究,根据我的理解,我需要创建一个嵌套的 naviagtion_graph(导航)或其他内容,听取 onDestinationChanged 并将底部导航或工具栏设置为 Gone..
我不是很明白这个..我只是想在大多数片段中隐藏底部导航栏..
这是我的 navigation_gragh (mobile_navigation
) :
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mobile_navigation"
app:startDestination="@+id/navigation_home">
<fragment
android:id="@+id/navigation_home"
android:name="com.example.testingbottomnav.ui.home.HomeFragment"
android:label="@string/title_home"
tools:layout="@layout/fragment_home" >
<action
android:id="@+id/action_navigation_home_to_newScreenFragment"
app:destination="@id/newScreenFragment" />
</fragment>
<fragment
android:id="@+id/navigation_dashboard"
android:name="com.example.testingbottomnav.ui.dashboard.DashboardFragment"
android:label="@string/title_dashboard"
tools:layout="@layout/fragment_dashboard" />
<fragment
android:id="@+id/navigation_notifications"
android:name="com.example.testingbottomnav.ui.notifications.NotificationsFragment"
android:label="@string/title_notifications"
tools:layout="@layout/fragment_notifications" />
<fragment
android:id="@+id/newScreenFragment"
android:name="com.example.testingbottomnav.ui.newscreen.NewScreenFragment"
android:label="fragment_new_screen"
tools:layout="@layout/fragment_new_screen" />
</navigation>
这是我的 activity_main.xml
:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="?attr/actionBarSize">
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/nav_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="0dp"
android:layout_marginEnd="0dp"
android:background="?android:attr/windowBackground"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:labelVisibilityMode="selected"
app:menu="@menu/bottom_nav_menu" />
<fragment
android:id="@+id/nav_host_fragment_activity_main"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:layout_constraintBottom_toTopOf="@id/nav_view"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/mobile_navigation" />
</androidx.constraintlayout.widget.ConstraintLayout>
这是我的 MainActivty.kt
:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val navView: BottomNavigationView = binding.navView
val navController = findNavController(R.id.nav_host_fragment_activity_main)
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
val appBarConfiguration = AppBarConfiguration(
setOf(
R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications
)
)
setupActionBarWithNavController(navController, appBarConfiguration)
navView.setupWithNavController(navController)
}
}
任何帮助将不胜感激,谢谢..
首先设置导航,然后将目的地更改侦听器添加到导航控制器。每当您导航到片段 navController.navigate(/* Some Destination Id */)
时,目标更改侦听器就会在那里启动,您可以检查并比较是否要显示或隐藏底部导航或工具栏。
private fun setupBottomNavigation() {
val navHostFragment = supportFragmentManager
.findFragmentById(R.id.fragment_container_view) as NavHostFragment?
if (navHostFragment != null) {
navController = navHostFragment.navController
setupWithNavController(binding!!.navView, navController!!)
initDestinationListener()
}
}
private fun initDestinationListener() {
navController!!.addOnDestinationChangedListener { controller: NavController?, destination: NavDestination, bundle: Bundle? ->
// Showing or Hiding Bottom Navigation on Specific Screen
if (destination.id == R.id.navigation_plan ||
destination.id == R.id.navigation_video ||
destination.id == R.id.navigation_about ||
destination.id == R.id.navigation_detail ||
destination.id == R.id.navigation_contact ||
destination.id == R.id.navigation_privacy ||
destination.id == R.id.navigation_comments
) {
hideBottomNavigation()
} else {
showBottomNavigation()
}
}
}
我在 onCreate 方法中添加了这行代码:
// hiding bottom bar
navController.addOnDestinationChangedListener { _, nd: NavDestination, _ ->
// the IDs of fragments as defined in the `navigation_graph`
if (nd.id == R.id.navigation_home || nd.id == R.id.navigation_dashboard
|| nd.id == R.id.navigation_notifications
) {
navView.visibility = View.VISIBLE
} else {
navView.visibility = View.GONE
}
}
如果您想让您的 BottomNavigationView
仅在目标是顶级目标时可见,您可以尝试:
val appBarConfiguration = AppBarConfiguration(
setOf(
R.id.navigation_home,
R.id.navigation_dashboard,
R.id.navigation_notifications
)
)
navController.addOnDestinationChangedListener { controller: NavController, destination: NavDestination, bundle: Bundle? ->
yourBottomNavigationView.isVisible = appBarConfiguration.topLevelDestinations.contains(destination.id)
}
您可以编写一个方法来在 activity 中初始化导航并在此方法中隐藏导航并在 onCreate() 中使用它,如下所示:
private fun setupNavigation() {
val navController = findNavController(R.id.nav_host_fragment_activity_main)
navView.setupWithNavController(navController)
navController.addOnDestinationChangedListener { controller, destination, arguments ->
when (destination.id) {
R.id.fragment1 -> bottomNavigation.visibility = View.VISIBLE
R.id.fragment2 -> bottomNavigation.visibility = View.VISIBLE
R.id.fragment3 -> bottomNavigation.visibility = View.VISIBLE
else -> bottomNavigation.visibility = View.GONE
}
}
}
此代码在片段 1、2、3 中显示导航并在另一个片段中隐藏它
我试图仅在几个片段中显示底部栏导航(即,为我的大部分片段隐藏它)..
我读了 official document about this, but it unclear to me, like where do I put the code, and I read
我对此进行了研究,根据我的理解,我需要创建一个嵌套的 naviagtion_graph(导航)或其他内容,听取 onDestinationChanged 并将底部导航或工具栏设置为 Gone..
我不是很明白这个..我只是想在大多数片段中隐藏底部导航栏..
这是我的 navigation_gragh (mobile_navigation
) :
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mobile_navigation"
app:startDestination="@+id/navigation_home">
<fragment
android:id="@+id/navigation_home"
android:name="com.example.testingbottomnav.ui.home.HomeFragment"
android:label="@string/title_home"
tools:layout="@layout/fragment_home" >
<action
android:id="@+id/action_navigation_home_to_newScreenFragment"
app:destination="@id/newScreenFragment" />
</fragment>
<fragment
android:id="@+id/navigation_dashboard"
android:name="com.example.testingbottomnav.ui.dashboard.DashboardFragment"
android:label="@string/title_dashboard"
tools:layout="@layout/fragment_dashboard" />
<fragment
android:id="@+id/navigation_notifications"
android:name="com.example.testingbottomnav.ui.notifications.NotificationsFragment"
android:label="@string/title_notifications"
tools:layout="@layout/fragment_notifications" />
<fragment
android:id="@+id/newScreenFragment"
android:name="com.example.testingbottomnav.ui.newscreen.NewScreenFragment"
android:label="fragment_new_screen"
tools:layout="@layout/fragment_new_screen" />
</navigation>
这是我的 activity_main.xml
:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="?attr/actionBarSize">
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/nav_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="0dp"
android:layout_marginEnd="0dp"
android:background="?android:attr/windowBackground"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:labelVisibilityMode="selected"
app:menu="@menu/bottom_nav_menu" />
<fragment
android:id="@+id/nav_host_fragment_activity_main"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:layout_constraintBottom_toTopOf="@id/nav_view"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/mobile_navigation" />
</androidx.constraintlayout.widget.ConstraintLayout>
这是我的 MainActivty.kt
:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val navView: BottomNavigationView = binding.navView
val navController = findNavController(R.id.nav_host_fragment_activity_main)
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
val appBarConfiguration = AppBarConfiguration(
setOf(
R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications
)
)
setupActionBarWithNavController(navController, appBarConfiguration)
navView.setupWithNavController(navController)
}
}
任何帮助将不胜感激,谢谢..
首先设置导航,然后将目的地更改侦听器添加到导航控制器。每当您导航到片段 navController.navigate(/* Some Destination Id */)
时,目标更改侦听器就会在那里启动,您可以检查并比较是否要显示或隐藏底部导航或工具栏。
private fun setupBottomNavigation() {
val navHostFragment = supportFragmentManager
.findFragmentById(R.id.fragment_container_view) as NavHostFragment?
if (navHostFragment != null) {
navController = navHostFragment.navController
setupWithNavController(binding!!.navView, navController!!)
initDestinationListener()
}
}
private fun initDestinationListener() {
navController!!.addOnDestinationChangedListener { controller: NavController?, destination: NavDestination, bundle: Bundle? ->
// Showing or Hiding Bottom Navigation on Specific Screen
if (destination.id == R.id.navigation_plan ||
destination.id == R.id.navigation_video ||
destination.id == R.id.navigation_about ||
destination.id == R.id.navigation_detail ||
destination.id == R.id.navigation_contact ||
destination.id == R.id.navigation_privacy ||
destination.id == R.id.navigation_comments
) {
hideBottomNavigation()
} else {
showBottomNavigation()
}
}
}
我在 onCreate 方法中添加了这行代码:
// hiding bottom bar
navController.addOnDestinationChangedListener { _, nd: NavDestination, _ ->
// the IDs of fragments as defined in the `navigation_graph`
if (nd.id == R.id.navigation_home || nd.id == R.id.navigation_dashboard
|| nd.id == R.id.navigation_notifications
) {
navView.visibility = View.VISIBLE
} else {
navView.visibility = View.GONE
}
}
如果您想让您的 BottomNavigationView
仅在目标是顶级目标时可见,您可以尝试:
val appBarConfiguration = AppBarConfiguration(
setOf(
R.id.navigation_home,
R.id.navigation_dashboard,
R.id.navigation_notifications
)
)
navController.addOnDestinationChangedListener { controller: NavController, destination: NavDestination, bundle: Bundle? ->
yourBottomNavigationView.isVisible = appBarConfiguration.topLevelDestinations.contains(destination.id)
}
您可以编写一个方法来在 activity 中初始化导航并在此方法中隐藏导航并在 onCreate() 中使用它,如下所示:
private fun setupNavigation() {
val navController = findNavController(R.id.nav_host_fragment_activity_main)
navView.setupWithNavController(navController)
navController.addOnDestinationChangedListener { controller, destination, arguments ->
when (destination.id) {
R.id.fragment1 -> bottomNavigation.visibility = View.VISIBLE
R.id.fragment2 -> bottomNavigation.visibility = View.VISIBLE
R.id.fragment3 -> bottomNavigation.visibility = View.VISIBLE
else -> bottomNavigation.visibility = View.GONE
}
}
}
此代码在片段 1、2、3 中显示导航并在另一个片段中隐藏它