У меня есть 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
создание вызывалось при каждом переключении навигации.
Любая помощь будет оценена!