How to set default BottomNavigationView tab in Kotlin?

Viewed 5459

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)
    }
}
1 Answers
Related