如何根据所选项目在 BottomNavigationView 上加载片段?

How to load fragment on BottomNavigationView depending on selected item?

我有一个用 Kotlin 编写的简单应用程序,它有一个 BottomNavigationView。这个想法是让单个 activity (MainActivity) 带有要为 BottomNavigationView 上的每个选项卡加载的片段。

我已经创建了一个要在选择选项卡时加载的片段 (HomeFragment),并且已经在活动选项卡更改时更改 BottomNavigationView 上图标下的文本。

现在我想在更改选项卡时膨胀/加载片段。我该怎么做?

MainActivity.kt:

class MainActivity : AppCompatActivity() {

    private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
        when (item.itemId) {
            R.id.navigation_enrollments -> {
                message.setText(R.string.title_enrollments)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_timeline -> {
                message.setText(R.string.title_timeline)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_home -> {
                message.setText(R.string.title_home)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_alerts -> {
                message.setText(R.string.title_alerts)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_profile -> {
                message.setText(R.string.title_profile)
                return@OnNavigationItemSelectedListener true
            }
        }
        false
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
    }

    override fun onResume() {
        super.onResume()

        setContentView(R.layout.activity_main)

        val bottomNavigationView = findViewById<BottomNavigationView>(R.id.navigation)
        bottomNavigationView.selectedItemId = R.id.navigation_home
    }
}

而不是message.setText(R.string.title_enrollments)

supportFragmentManager.beginTransaction()
    .replace(containerViewId, fragmentInstance, "TAG")
    .commitAllowingStateLoss()

或者您可以使用我在代码中使用的扩展函数来使其更清晰。只需将其添加到某些 .kt 文件

inline fun FragmentManager.transactStateless(func: FragmentTransaction.() -> Unit) {
    val transaction = beginTransaction()
    transaction.func()
    transaction.commitAllowingStateLoss()
}

现在您可以通过这种方式添加删除片段:

supportFragmentManager.transactStateless {
    replace(containerViewId, fragmentInstance, "TAG")
}