【问题标题】:How to load fragment on BottomNavigationView depending on selected item?如何根据所选项目在 BottomNavigationView 上加载片段?
【发布时间】:2017-08-10 19:34:08
【问题描述】:

我有一个用 Kotlin 编写的简单应用程序,它有一个 BottomNavigationView。这个想法是有一个单一的活动(MainActivity),并为底部导航视图上的每个选项卡加载一个片段。

我已经创建了一个片段,我想在选择选项卡时加载(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
    }
}

【问题讨论】:

    标签: android android-fragments kotlin bottomnavigationview


    【解决方案1】:

    而不是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")
    }
    

    【讨论】:

    • 在这种情况下我将如何加载我的 HomeFragment? fragmentInstance 是 HomeFragment 吗? containerViewId 应该变成 R.layout.activity_main 吗?还有什么是“TAG”?
    • fragmentInstance 是您的 HomeFragment 或您想要的任何其他片段的实例。 containerViewId 是您的 activity_main 文件中顶级视图的 ID。 "TAG" 只是一个标签,您可以使用它从片段管理器再次获取片段
    猜你喜欢
    • 2018-02-13
    • 1970-01-01
    • 2022-10-12
    • 2017-08-31
    • 2020-12-24
    • 2015-02-18
    • 1970-01-01
    • 2017-03-05
    相关资源
    最近更新 更多