如何根据所选项目在 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")
}
我有一个用 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")
}