Перемещение между фрагментами без отдыха - Котлин - PullRequest
1 голос
/ 19 мая 2019

Я пытаюсь переместиться между двумя fragments без их воссоздания, чтобы данные в предыдущем фрагменте не исчезали.

Я пытался найти ответы в Интернете и пытался часами, но безуспешно. Я посмотрел на эти ссылки:

После show() и hide() Я также попробовал AddToBackStack(), но пока безуспешно

class MainActivity : AppCompatActivity(){

    private val onNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
        @Override
        when (item.itemId) {
            R.id.navigation_home -> {
                //replaceFragment(SignInFragment())
                supportFragmentManager.beginTransaction().hide(AllEventsFragment()).commit()
                supportFragmentManager.beginTransaction().show(SignInFragment()).commit()
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_events -> {
                //replaceFragment(AllEventsFragment())
                supportFragmentManager.beginTransaction().hide(SignInFragment()).commit()
                supportFragmentManager.beginTransaction().show(AllEventsFragment()).commit()
                if (currentUser.isNotEmpty()) {
                    updateRecyclerView()
                    sign_in_error?.visibility = View.INVISIBLE
                }
                return@OnNavigationItemSelectedListener true
            }
        }
        return@OnNavigationItemSelectedListener false
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        supportFragmentManager.beginTransaction().add(R.id.activity_main, AllEventsFragment(), "2").commit()
        supportFragmentManager.beginTransaction().add(R.id.activity_main, SignInFragment(), "1").commit()
        val navView: BottomNavigationView = findViewById(R.id.nav_view)
        navView.setOnNavigationItemSelectedListener(onNavigationItemSelectedListener)
        personInEvent = false
    }

Результат - перекрывающиеся фрагменты без возможности по-настоящему перемещаться между ними. Я действительно попробовал все, что я знаю, есть некоторые ответы в Интернете, но ни один из них не помог мне решить мою проблему Я был бы очень признателен за помощь в решении этой неприятной проблемы.

До навигации: Before navigation:

После навигации: After navigation:

Ответы [ 2 ]

2 голосов
/ 19 мая 2019
supportFragmentManager.beginTransaction().hide(AllEventsFragment()).commit()

Вы воссоздаете свои фрагменты каждый раз!вызов AllEventsFragment() эквивалентен new AllEventsFragment()

, вам нужно сначала создать их экземпляр, например, ваш код должен быть таким,

    val fragment1: Fragment = SignInFragment()
    val fragment2: Fragment = AllEventsFragment()
    var active = fragment1

      override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            supportFragmentManager.beginTransaction().add(R.id.activity_main,fragment2 , "2").commit()
            supportFragmentManager.beginTransaction().add(R.id.activity_main, fragment1, "1").commit()
            val navView: BottomNavigationView = findViewById(R.id.nav_view)
            navView.setOnNavigationItemSelectedListener(onNavigationItemSelectedListener)
            personInEvent = false
        }

внутри слушателя

    R.id.navigation_home -> {
                 supportFragmentManager.beginTransaction().beginTransaction().hide(active).show(fragment1).commit();
                    active = fragment1;
                return@OnNavigationItemSelectedListener true
            }
 R.id.navigation_events -> {
                //replaceFragment(AllEventsFragment())
                supportFragmentManager.beginTransaction().beginTransaction().hide(active).show(fragment2).commit();
active = fragment2
)

    //handle rest of the cases 
0 голосов
/ 19 мая 2019

Взгляните на компоненты architicture, yuo также может достичь этого по-старому Android - сохранить / восстановить состояние фрагмента Когда фрагмент недоступен для просмотра, он приостановлен или даже может быть уничтожен, используя bundle для сохранения данных.То, что вы пытаетесь достичь, может быть сделано с использованием двух контейнеров, но вы действительно не должны

...