如何在 Kotlin 中设置默认的 BottomNavigationView 选项卡?

How to set default BottomNavigationView tab in Kotlin?

我一直在尝试在我的 onCreate (bottomNavigationView.setSelectedItemId(R.id.item_id)) 中使用广泛接受的 java 方法设置我的默认选择选项卡,但这似乎不起作用科特林。此外,设置为在每个选定项目上加载的片段似乎在每次选择该菜单项时都会加载,并在前一个片段上绘制它们的内容。

如何为我的 BottomNavigationView 设置默认选择的选项卡?我是否正确加载了片段,或者我的代码在加载另一个片段之前没有正确处理片段?

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)
    }
}

通过将以下代码添加到我的 onCreate 函数解决了默认选择的选项卡问题:

    val bottomNavigationView: BottomNavigationView = findViewById(R.id.navigation) as BottomNavigationView
    bottomNavigationView.selectedItemId = R.id.navigation_home

此外,我通过修改以下内容解决了片段被绘制在彼此之上的问题:

if (frag != null) {
        val ft = supportFragmentManager.beginTransaction()
        ft.replace(R.id.content, frag, frag.tag)
        ft.commit()
    }
}

我把ft.add改成了ft.replace