Замена фрагмента на исходный экземпляр в NavigationDrawer - PullRequest
0 голосов
/ 12 июля 2020

Я использую действие NavigationDrawer и реализовал метод onNavigationItemSelected, как указано ниже.

override fun onNavigationItemSelected(item: MenuItem): Boolean {
    when (item.itemId) {
        R.id.nav_home -> {
             var homeFragment:HomeFragment =HomeFragment ()
             supportFragmentManager.beginTransaction().replace(R.id.content_frame,homeFragment)
                  .addToBackStack(null).commit()
        }
        R.id.nav_profile -> {
             var profileFragment:ProfileFragment =ProfileFragment ()
             supportFragmentManager.beginTransaction().replace(R.id.content_frame,profileFragment)
                  .addToBackStack(null).commit()
        }
        R.id.nav_history -> {
             var historyFragment:HistoryFragment =HistoryFragment ()
             supportFragmentManager.beginTransaction().replace(R.id.content_frame,historyFragment)
                  .addToBackStack(null).commit()            }
        }
    val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
    drawerLayout.closeDrawer(GravityCompat.START)
    return true
    }

Вопрос: как мне получить тот же экземпляр этих фрагментов, когда Щелкаю второй раз по пункту? Я читал об использовании для этого findFragmentByTag. Но я не мог понять, как это реализовать здесь.

Чтобы уточнить свой вопрос: я щелкнул дома, профиля, истории в таком порядке. Затем я снова нажал кнопку «Домой». Я хочу заменить исходный экземпляр HomeFragment (а не новый экземпляр) в кадре содержимого.

Ответы [ 2 ]

1 голос
/ 12 июля 2020

Вы можете держать экземпляр фрагментов. Но каждый фрагмент onCreateView () обязательно будет вызываться каждый раз. Вы можете лениво инициализировать их как некую форму улучшения.

0 голосов
/ 19 июля 2020

(отвечая на свой вопрос). Изменил код, чтобы проверить, существует ли уже фрагмент, с помощью TAG. См. Код ниже:

override fun onNavigationItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
    R.id.nav_home -> {
        
       var homeFragment = supportFragmentManager.findFragmentByTag("HOME")
        if(homeFragment == null){
            supportFragmentManager.beginTransaction()
                .replace(R.id.content_frame, RideFragment(), "HOME").addToBackStack(null).commit()
        } else {
            supportFragmentManager.beginTransaction().replace(R.id.content_frame,homeFragment, "HOME")
                .addToBackStack(null).commit()
        }
    }
    R.id.nav_profile -> {
        
        var profileFragment = supportFragmentManager.findFragmentByTag("PROFILE")
        if(profileFragment == null){
            supportFragmentManager.beginTransaction()
                .replace(R.id.content_frame, RideFragment(), "PROFILE").addToBackStack(null).commit()
        } else {
            supportFragmentManager.beginTransaction().replace(R.id.content_frame,profileFragment, "PROFILE")
                .addToBackStack(null).commit()
        }
    }
    R.id.nav_history -> {
        
        var historyFragment = supportFragmentManager.findFragmentByTag("HISTORY")
        if(historyFragment == null){
            supportFragmentManager.beginTransaction()
                .replace(R.id.content_frame, RideFragment(), "HISTORY").addToBackStack(null).commit()
        } else {
            supportFragmentManager.beginTransaction().replace(R.id.content_frame,historyFragment, "HISTORY")
                .addToBackStack(null).commit()
        }

    }
        val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
        drawerLayout.closeDrawer(GravityCompat.START)
        return true
}
...