Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何将底部导航侦听器添加到片段_Android_Android Fragments_Kotlin_Androidx_Android Navigation - Fatal编程技术网

Android 如何将底部导航侦听器添加到片段

Android 如何将底部导航侦听器添加到片段,android,android-fragments,kotlin,androidx,android-navigation,Android,Android Fragments,Kotlin,Androidx,Android Navigation,我曾经有一个活动,包括导航主机和允许在3个片段之间切换视图的BottomNavigationView。我最近改变了我的设计,使最初的活动现在代表一个新的片段,并且存在一个按钮,允许用户导航到另一个片段,该片段应该包含前面提到的3个选项卡式底部导航 我已经成功地实现了最初的活动和第一个片段。但我遇到的问题是,当我使用3个选项卡式底部导航栏导航到第二个片段时,我不知道如何在选项卡上实现onClickListener。当我在AppCompatActivity中有底部导航时,它曾经非常简单。我猜碎片不应

我曾经有一个活动,包括导航主机和允许在3个片段之间切换视图的
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好吧,被接受的答案并不完全是我想要的解决方案,但它满足了我的需要。我希望我以后能想出一个更好的设计。