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

标签 android kotlin bottomnavigationview

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

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

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

此外,我通过修改以下内容解决了 fragment 相互重叠绘制的问题:

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

我将 ft.add 更改为 ft.replace

关于android - 如何在 Kotlin 中设置默认的 BottomNavigationView 选项卡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45686090/

相关文章:

file - 如何很好地阅读 "alternating"行?

java - 在Android设备上使用Java/Kotlin检测音频文件(amr)中的静音

java - 如何使状态 View 突出显示和超链接

Android,如何在底部导航 View 中使用协调器布局

java - 选择相同位置时禁用动画底部导航

BottomNavigationBar 项目的 Flutter 本地化

java - Android Studio 和 Firebase : Show ImageView on Full Screen

java.lang.NoClassDefFoundError : Failed resolution of: Landroid/support/v4/content/LocalBroadcastManager only on Build APK 错误

android.support.v4.widget.SwipeRefreshLayout 在 android.support.design.widget.AppBarLayout 内部时不滑动

java - 由于正在运行的线程,应用程序在关闭 fragment 时崩溃