I have been trying to set my default selected tab using the widely accepted java method in my onCreate (bottomNavigationView.setSelectedItemId(R.id.item_id)) but this does not seem to work in Kotlin. Also, the fragments that are set to load on each selected item seem to load every time that menu item is selected, as well as drawing their contents over the previous fragment.
How can I set the default selected tab for my BottomNavigationView? Also am I correctly loading fragments or is my code not properly disposing of fragments before loading another one?
MainActivity.kt
class MainActivity : AppCompatActivity() {
private val SELECTED_ITEM = "arg_selected_item"
private var mBottomNav: BottomNavigationView? = null
private var mSelectedItem: Int = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mBottomNav = findViewById(R.id.navigation) as BottomNavigationView
mBottomNav!!.setOnNavigationItemSelectedListener { item ->
selectFragment(item)
true
}
val selectedItem: MenuItem
if (savedInstanceState != null) {
mSelectedItem = savedInstanceState.getInt(SELECTED_ITEM, 0)
selectedItem = mBottomNav!!.menu.findItem(mSelectedItem)
} else {
selectedItem = mBottomNav!!.menu.getItem(0)
}
selectFragment(selectedItem)
}
override fun onSaveInstanceState(outState: Bundle) {
outState.putInt(SELECTED_ITEM, mSelectedItem)
super.onSaveInstanceState(outState)
}
override fun onBackPressed() {
val homeItem = mBottomNav!!.menu.getItem(0)
if (mSelectedItem != homeItem.itemId) {
// select home item
selectFragment(homeItem)
} else {
super.onBackPressed()
}
}
private fun selectFragment(item: MenuItem) {
var frag: Fragment? = null
// init corresponding fragment
when (item.itemId) {
R.id.navigation_enrollments -> frag = EnrollmentsFragment.newInstance()
R.id.navigation_timeline -> frag = TimelineFragment.newInstance()
R.id.navigation_home -> frag = HomeFragment.newInstance()
R.id.navigation_alerts -> frag = AlertsFragment.newInstance()
R.id.navigation_profile -> frag = ProfileFragment.newInstance()
}
// update selected item
mSelectedItem = item.itemId
// uncheck the other items.
for (i in 0..mBottomNav!!.menu.size() - 1) {
val menuItem = mBottomNav!!.menu.getItem(i)
menuItem.isChecked = menuItem.itemId == item.itemId
}
updateToolbarText(item.title)
if (frag != null) {
val ft = supportFragmentManager.beginTransaction()
ft.add(R.id.content, frag, frag.tag)
ft.commit()
}
}
private fun updateToolbarText(text: CharSequence) {
val actionBar = supportActionBar
if (actionBar != null) {
actionBar.title = text
}
}
private fun getColorFromRes(@ColorRes resId: Int): Int {
return ContextCompat.getColor(this, resId)
}
}