【发布时间】:2017-07-21 14:29:54
【问题描述】:
我有一个BottomNavigationView 的简单活动。我正在使用片段来实现不同页面的活动内容。
当用户按下返回按钮时,它应该返回到之前查看的页面。问题是,当您在页面(片段)之间反复来回切换时,整个历史都会被记录下来。举个例子:
A -> B -> A -> B -> C -> A -> C
按下后退按钮会导致相反的结果,但我想要这种行为(我在 Instagram 应用程序中注意到它):
C -> A -> B -> 退出应用程序
所以每个片段在后台堆栈中应该只有一个条目。我该怎么做呢?我是否要从堆栈中删除片段的先前事务?
这完全可以使用 FragmentManager 吗?还是我必须自己实现?
我的带有底部导航视图的活动:
class ActivityOverview : AppCompatActivity() {
// Listener for BottomNavigationView
private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
when (item.itemId) {
R.id.navigation_home -> {
// "Home" menu item pressed
setActiveFragment(resources.getString(R.string.tag_fragment_home))
return@OnNavigationItemSelectedListener true
}
R.id.navigation_dashboard -> {
// "Dashboard" menu item pressed
return@OnNavigationItemSelectedListener true
}
R.id.navigation_settings -> {
// "Settings" menu item pressed
setActiveFragment(resources.getString(R.string.tag_fragment_settings))
return@OnNavigationItemSelectedListener true
}
}
false
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_overview)
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
navigation.menu.findItem(R.id.navigation_home).setChecked(true)
// Set initial fragment
setActiveFragment(resources.getString(R.string.tag_fragment_home))
}
override fun onBackPressed() {
// > 1 so initial fragment addition isn't removed from stack
if (fragmentManager.backStackEntryCount > 1) {
fragmentManager.popBackStack()
} else {
finish()
}
}
// Update displayed fragment
fun setActiveFragment(tag: String) {
val fragment = if (fragmentManager.findFragmentByTag(tag) != null) {
// Fragment is already initialized
if (fragmentManager.findFragmentByTag(tag).isVisible) {
// Fragment is visible already, don't add another transaction
null
} else {
// Fragment is not visible, add transaction
fragmentManager.findFragmentByTag(tag)
}
} else {
// Fragment is not initialized yet
when (tag) {
resources.getString(R.string.tag_fragment_home) -> FragmentHome()
resources.getString(R.string.tag_fragment_settings) -> FragmentSettings()
else -> null
}
}
if (fragment != null) {
val transaction = fragmentManager.beginTransaction()
transaction.replace(R.id.container_fragment, fragment, tag)
transaction.addToBackStack(null)
transaction.commit()
}
}
}
【问题讨论】:
-
直觉反应是:每次添加片段时,在片段管理器中查找它,如果存在则将其删除(使用
FragmentTransaction.remove())。这样,您的片段管理器中只有一个给定片段的实例,最新的在顶部。 -
@BenP。但是如何检索实际事务,而不仅仅是片段?
标签: android android-fragments kotlin