DrawerActivity с вкладками - PullRequest
0 голосов
/ 20 февраля 2020

Мне нужна помощь, потому что я схожу с ума. У меня есть проект, в котором я уже реализовал вкладки. Теперь я хочу поставить Навигационный ящик. Все, что я хочу, - это когда я выбираю меню «Ящик», я меняю вкладки, но я не знаю, как на него ссылаться. Я показываю код MainActivity:

Как видите, я уже реализовал несколько вкладок. И ящик деятельности. Каждый элемент в блоке «Активность» вызывает фрагмент, а каждая вкладка, в свою очередь, вызывает другой фрагмент для отображения в ViewPager.

class MainActivity : ToolbarActivity() {


private var prevBottomSelected: MenuItem? = null
private lateinit var appBarConfiguration: AppBarConfiguration

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val toolbar: Toolbar = findViewById(R.id.toolbar)
    setSupportActionBar(toolbar)

    setUpViewPager(getPagerAdapter())
    setUpBottomNavigationBar()

    val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
    val navView: NavigationView = findViewById(R.id.nav_view)
    val navController = findNavController(R.id.nav_host_fragment)
    // Passing each menu ID as a set of Ids because each
    // menu should be considered as top level destinations.
    appBarConfiguration = AppBarConfiguration(
        setOf(
            R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow,
            R.id.nav_tools, R.id.nav_share, R.id.nav_send
        ), drawerLayout
    )
    setupActionBarWithNavController(navController, appBarConfiguration)
    navView.setupWithNavController(navController)
}

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    // Inflate the menu; this adds items to the action bar if it is present.
    menuInflater.inflate(R.menu.drawer, menu)
    return true
}

override fun onSupportNavigateUp(): Boolean {
    val navController = findNavController(R.id.nav_host_fragment)
    return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
}


private fun getPagerAdapter(): PagerAdapter{
    val adapter = PagerAdapter(supportFragmentManager)
    adapter.addFragment(InfoFragment())
    adapter.addFragment(RateFragment())
    adapter.addFragment(ChatFragment())
    return adapter
}

private fun setUpViewPager(adapter: PagerAdapter){
    viewPager.adapter = adapter
    viewPager.addOnPageChangeListener(object: ViewPager.OnPageChangeListener{
        override fun onPageScrollStateChanged(state: Int) {}
        override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
        override fun onPageSelected(position: Int) {
            // Selección de menu inferior, configuracion de como aparecen seleccionados
            if(prevBottomSelected == null){
                bottomNavigation.menu.getItem(0).isChecked = false
            } else {
                prevBottomSelected!!.isChecked = false
            }
            bottomNavigation.menu.getItem(position).isChecked = true
            prevBottomSelected = bottomNavigation.menu.getItem(position)
        }
    })
}

private fun setUpBottomNavigationBar(){
        bottomNavigation.setOnNavigationItemSelectedListener { item ->
            when (item.itemId){
                R.id.bottom_nav_info -> {
                    viewPager.currentItem = 0; true
                }
                R.id.bottom_nav_rates -> {
                    viewPager.currentItem = 1; true
                }
                R.id.bottom_nav_chat -> {
                    viewPager.currentItem = 2; true
                }
                else -> false
            }
        }
}}

Введите код PageAdapter. Мне нужно, чтобы при нажатии nav_home в Drawer на вкладке появлялись разные фрагменты и элементы.

class PagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT){

private val fragmentList = ArrayList<Fragment>()

override fun getItem(position: Int): Fragment {
    return fragmentList[position]
}

override fun getCount(): Int {
    return fragmentList.size
}
fun addFragment(fragment: Fragment){
    fragmentList.add(fragment)}}

1 Ответ

0 голосов
/ 20 февраля 2020

Поскольку PagerAdapter является абстракцией, у вас, вероятно, есть реализация, которую мы не видим. Я думаю, что это является причиной проблемы. Если это так, попробуйте этот код для адаптера пейджера:

class pagerAdapter(fm: FragmentManager): FragmentStatePagerAdapter(fm) {
    override fun getItem(position: Int): Fragment {
        return when (position) {
            0 -> InfoFragment()
            1 -> RateFragment()
            2 -> ChatFragment()
            else -> throw RuntimeException("Unsupported fragment position")
        }
    }
    override fun getCount() = 3
}
...