Несколько фрагментов перекрываются и не скрываются при навигации - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть 2 случайные повторяющиеся проблемы в моем приложении, которые в настоящее время всплывают в работе:

  • Когда приложение возобновляется / открывается снова по истечении некоторого времени. fragments перекрывает друг друга при переключении между ними.
  • Когда приложение возобновляется / открывается, нижние значки навигации не реагируют на переключение контекста, даже если фрагмент загружается нормально.

Обе вышеупомянутые проблемы трудно воспроизвести локально. Я попробовал решение для замены фрагмента Однако на устройстве они всплывают очень часто сейчас. Вот как выглядит мой MainActivity:

class MainActivity : AppCompatActivity() {

    private val TAG_FRAGMENT_HOME = "fragment_home"
    private val TAG_FRAGMENT_NEWS = "fragment_news"
    private val TAG_FRAGMENT_MARKET = "fragment_market"
    private val TAG_FRAGMENT_EXPLORE = "fragment_explore"
    private var bottomNavigationView: BottomNavigationView? = null
    private lateinit var appBarConfiguration: AppBarConfiguration
    private val homeFragment = HomeFragment()
    private val marketsFragment = MarketsFragment()
    private val newsFragment = NewsFragment()
    private val exploreFragment = ExploreFragment()

    private lateinit var active: Fragment

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

        bottomNavigationView = findViewById(R.id.bottomNavigationView)
        bottomNavigationView!!.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)

    }

    private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
        when (item.itemId) {
            // Set up navigation here
            R.id.home -> {
                supportFragmentManager.beginTransaction().hide(active).show(homeFragment).commit()
                active = homeFragment
            }
            R.id.news ->{
                supportFragmentManager.beginTransaction().hide(active).show(newsFragment).commit()
                active = newsFragment
                return@OnNavigationItemSelectedListener true
            }
            R.id.markets -> {
                supportFragmentManager.beginTransaction().hide(active).show(marketsFragment).commit()
                active = marketsFragment
                return@OnNavigationItemSelectedListener true
            }
            R.id.explore -> {
                supportFragmentManager.beginTransaction().hide(active).show(exploreFragment).commit()
                active = exploreFragment
                return@OnNavigationItemSelectedListener true
            }
        }
        false
    }

    override fun onResume() {
        super.onResume()

        active = homeFragment
        supportFragmentManager.beginTransaction()
        if (!fragmentExists(TAG_FRAGMENT_EXPLORE)) {
            supportFragmentManager.beginTransaction().add(R.id.main_container, exploreFragment, TAG_FRAGMENT_EXPLORE).hide(exploreFragment).commit()
        }
        if (!fragmentExists(TAG_FRAGMENT_MARKET)) {
            supportFragmentManager.beginTransaction().add(R.id.main_container, marketsFragment, TAG_FRAGMENT_MARKET).hide(marketsFragment).commit()
        }
        if (!fragmentExists(TAG_FRAGMENT_NEWS)) {
            supportFragmentManager.beginTransaction().add(R.id.main_container, newsFragment, TAG_FRAGMENT_NEWS).hide(newsFragment).commit()
        }
        if (!fragmentExists(TAG_FRAGMENT_HOME)) {
            supportFragmentManager.beginTransaction().add(R.id.main_container,homeFragment, TAG_FRAGMENT_HOME).commit()
        }
    }
}

Предполагая, что когда пользователь повторно открывает приложение, вызывается onResume, я пытаюсь добавить только те фрагменты, которые еще не добавлены. Кроме того, я использую add вместо replace, поскольку я хочу загружать вместо ленивых. Как я заметил, при использовании replace fragment создание вызывалось при каждом переключении навигации.

Любая помощь будет оценена!

1 Ответ

0 голосов
/ 14 апреля 2020

Закончилась смена реализации и вместо нее использовалось this . Для любого, кто сталкивается с этой странной проблемой и использует supportFragmentManager, дайте этому шанс. Он использует navgraph для navigation между фрагментами. Похоже, это рекомендуемый способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...