Android 如何将底部导航侦听器添加到片段
我曾经有一个活动,包括导航主机和允许在3个片段之间切换视图的Android 如何将底部导航侦听器添加到片段,android,android-fragments,kotlin,androidx,android-navigation,Android,Android Fragments,Kotlin,Androidx,Android Navigation,我曾经有一个活动,包括导航主机和允许在3个片段之间切换视图的BottomNavigationView。我最近改变了我的设计,使最初的活动现在代表一个新的片段,并且存在一个按钮,允许用户导航到另一个片段,该片段应该包含前面提到的3个选项卡式底部导航 我已经成功地实现了最初的活动和第一个片段。但我遇到的问题是,当我使用3个选项卡式底部导航栏导航到第二个片段时,我不知道如何在选项卡上实现onClickListener。当我在AppCompatActivity中有底部导航时,它曾经非常简单。我猜碎片不应
BottomNavigationView
。我最近改变了我的设计,使最初的活动现在代表一个新的片段,并且存在一个按钮,允许用户导航到另一个片段,该片段应该包含前面提到的3个选项卡式底部导航
我已经成功地实现了最初的活动和第一个片段。但我遇到的问题是,当我使用3个选项卡式底部导航栏导航到第二个片段时,我不知道如何在选项卡上实现onClickListener
。当我在AppCompatActivity
中有底部导航时,它曾经非常简单。我猜碎片不应该用于这个案子。我可以轻松地使用另一个activity类,但我想构建一个activity应用程序,并想知道是否有其他解决方案
在使用activity类的原始方法中,我能够实现如下所示的底部导航:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
val navController = Navigation.findNavController(this, R.id.nav_host_fragment)
setupBottomNavMenu(navController)
setupActionBar(navController)
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_toolbar, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
val navController = Navigation.findNavController(this, R.id.nav_host_fragment)
val navigated = NavigationUI.onNavDestinationSelected(item!!, navController)
return navigated || super.onOptionsItemSelected(item)
}
override fun onSupportNavigateUp(): Boolean {
return NavigationUI.navigateUp(Navigation.findNavController(this, R.id.nav_host_fragment), drawer_layout)
}
private fun setupBottomNavMenu(navController: NavController) {
bottom_nav?.let {
NavigationUI.setupWithNavController(it, navController)
}
}
private fun setupActionBar(navController: NavController) {
NavigationUI.setupActionBarWithNavController(this, navController, drawer_layout)
}
}
class MainFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?): View? {
var binding: FragmentMainBinding = DataBindingUtil.inflate(
inflater,
R.layout.fragment_main,
container,
false
)
val application = requireNotNull(this.activity).application
val dataSource = UserProfileDatabase.getInstance(application).userProfileDao
val viewModelFactory = MainViewModelFactory(dataSource, application)
val navController = this.findNavController()
NavigationUI.setupWithNavController(binding.bottomNav, navController)
return binding.root
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
inflater.inflate(R.menu.menu_toolbar, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val navController = this.findNavController()
val navigated = NavigationUI.onNavDestinationSelected(item, navController)
return navigated || super.onOptionsItemSelected(item)
}
companion object {
fun newInstance(): MainFragment = MainFragment()
}
}
导航如下所示:
最后是菜单:
类似地,我尝试将其应用于如下片段:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
val navController = Navigation.findNavController(this, R.id.nav_host_fragment)
setupBottomNavMenu(navController)
setupActionBar(navController)
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_toolbar, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
val navController = Navigation.findNavController(this, R.id.nav_host_fragment)
val navigated = NavigationUI.onNavDestinationSelected(item!!, navController)
return navigated || super.onOptionsItemSelected(item)
}
override fun onSupportNavigateUp(): Boolean {
return NavigationUI.navigateUp(Navigation.findNavController(this, R.id.nav_host_fragment), drawer_layout)
}
private fun setupBottomNavMenu(navController: NavController) {
bottom_nav?.let {
NavigationUI.setupWithNavController(it, navController)
}
}
private fun setupActionBar(navController: NavController) {
NavigationUI.setupActionBarWithNavController(this, navController, drawer_layout)
}
}
class MainFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?): View? {
var binding: FragmentMainBinding = DataBindingUtil.inflate(
inflater,
R.layout.fragment_main,
container,
false
)
val application = requireNotNull(this.activity).application
val dataSource = UserProfileDatabase.getInstance(application).userProfileDao
val viewModelFactory = MainViewModelFactory(dataSource, application)
val navController = this.findNavController()
NavigationUI.setupWithNavController(binding.bottomNav, navController)
return binding.root
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
inflater.inflate(R.menu.menu_toolbar, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val navController = this.findNavController()
val navigated = NavigationUI.onNavDestinationSelected(item, navController)
return navigated || super.onOptionsItemSelected(item)
}
companion object {
fun newInstance(): MainFragment = MainFragment()
}
}
xml与活动的xml几乎完全相同
我希望在单击选项卡元素时调用onOptionsItemSelected(),但我无法这样做。如何在这些选项卡元素上实现侦听器,以便导航到正确的片段目的地?为什么不保留
BottomNavigationView
的第一个实现,使用addOnDestinationChangedListener
将其与新实现相结合
按住按钮的FirstFragment
将隐藏BottomNavigationView
,带有3个选项卡的底部导航的SecondFragment
将显示它
例如:
navController.addOnDestinationChangedListener { _, destination, _ ->
if(destination.id == R.id.first_fragment) {
// your intro fragment will hide your bottomNavigationView
bottomNavigationView.visibility = View.GONE
} else if (destination.id == R.id.second_fragment){
// your second fragment will show your bottomNavigationView
bottomNavigationView.visibility = View.VISIBLE
}
}
这样,你就可以在你的活动中保留控制权,而不是片段,从而更好地与你的听众和你的
NavController
可能重复的@YashKrishanVerma。我看了一下这个问题,但它没有回答我的问题。我已经知道如何在活动中创建导航和导航抽屉。我的问题是能够在片段中实现它。好的。很好,你找到了一个解决方案。@YashKrishanVerma好吧,被接受的答案并不完全是我想要的解决方案,但它满足了我的需要。我希望我以后能想出一个更好的设计。