gpt4 book ai didi

android - 如何从FragmentManager中删除重复的条目?

转载 作者:行者123 更新时间:2023-12-02 13:39:17 24 4
gpt4 key购买 nike

我有一个BottomNavigationView的简单 Activity 。我正在使用片段来实现不同页面的 Activity 内容。

当用户按下“后退”按钮时,它应该返回到先前查看的页面。问题是,当您在页面(片段)之间反复来回切换时,将记录整个历史记录。举个例子:

A-> B-> A-> B-> C-> A-> C

按下返回按钮将导致相反的结果,但是我想要这种行为(我在Instagram应用程序中注意到了):

C-> A-> B->退出应用

因此,每个片段在后堆栈中应该只有一个条目。我该怎么做呢?我要从堆栈中删除片段的先前交易吗?

使用FragmentManager可以做到吗?还是我必须实现自己的?

我的BottomNavigationView Activity :

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()
}
}
}

最佳答案

在这一点上,我非常确定它不能与FragmentManager一起使用,因此我创建了一个类来实现不允许重复的堆栈:

class NoDuplicateStack<T> {

val stack: MutableList<T> = mutableListOf()
val size: Int
get() = stack.size

// Push element onto the stack
fun push(p: T) {
val index = stack.indexOf(p)
if (index != -1) {
stack.removeAt(index)
}
stack.add(p)
}

// Pop upper element of stack
fun pop(): T? {
if (size > 0) {
return stack.removeAt(stack.size - 1)
} else {
return null
}
}

// Look at upper element of stack, don't pop it
fun peek(): T? {
if (size > 0) {
return stack[stack.size - 1]
} else {
return null
}
}

}

然后,我将此类(class)整合到我的 Activity 中:
class ActivityOverview : AppCompatActivity() {

val fragmentsStack = NoDuplicateStack<String>()
val fragmentHome = FragmentHome()
val fragmentSettings = FragmentSettings()
val fragmentHistory = FragmentHistory()

// Listener for BottomNavigationView
private val mOnNavigationItemSelectedListener = ...

override fun onCreate(savedInstanceState: Bundle?) {
...
}

override fun onBackPressed() {
if (fragmentsStack.size > 1) {
// Remove current fragment from stack
fragmentsStack.pop()
// Get previous fragment from stack and set it again
val newTag = fragmentsStack.pop()
if (newTag != null) {
setActiveFragment(newTag)
}
} else {
finish()
}
}

// Update displayed fragment
fun setActiveFragment(tag: String) {
val fragment = when (tag) {
resources.getString(R.string.tag_fragment_home) -> fragmentHome
resources.getString(R.string.tag_fragment_settings) -> fragmentSettings
resources.getString(R.string.tag_fragment_history) -> fragmentHistory
else -> null
}

if (fragment != null && !fragment.isVisible) {
fragmentManager.beginTransaction()
.replace(R.id.container_fragment, fragment, tag)
.commit()
fragmentsStack.push(tag)
}
}
}

关于android - 如何从FragmentManager中删除重复的条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45240268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com