sách gpt4 ai đã đi

Thay thế, thêm, thay thế đoạn, sau đó điều hướng nút quay lại không hoạt động cho đoạn đầu tiên

In lại 作者:行者123 更新时间:2023-11-30 00:06:18 hai mươi bốn 4
mua khóa gpt4 Nike

我有一个 fragment 堆栈,我在其中使用替换和相加。添加或替换我的 fragment 的代码(在我的 Activity 中)如下

private fun addFragment(fragment: Fragment, name: String) {
supportFragmentManager.beginTransaction().add(R.id.container, fragment)
.addToBackStack(name).commit()
}

private fun replaceFragment(fragment: Fragment, name: String) {
supportFragmentManager.beginTransaction().replace(R.id.container, fragment)
.addToBackStack(name).commit()
}

在我的 fragment 中,我确实有一个带有主菜单后退图标的工具栏。单击后,它应该有助于将我的 fragment 弹出到上一个堆栈。

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
toolbar_actionbar.setNavigationIcon(R.drawable.ic_arrow_back_black_24dp)
setHasOptionsMenu(true)
(activity as AppCompatActivity).setSupportActionBar(toolbar_actionbar)
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
return if (item.itemId == android.R.id.home) {
activity?.onBackPressed()
ĐÚNG VẬY
} khác {
super.onOptionsItemSelected(item)
}
}

为了清楚起见,我展示了 onBackPressed Activity 的编码如下

override fun onBackPressed() {
if (supportFragmentManager.backStackEntryCount > 0) {
supportFragmentManager.popBackStackImmediate()
} khác {
super.onBackPressed()
}
}

现在,如果我添加 fragment1、添加 fragment2、添加 fragment3、添加 fragment4,然后按返回、返回、返回、返回...一切正常。

同样,如果我用 fragment1 替换,用 fragment2 替换,用 fragment3 替换,用 fragment4 替换,然后返回,返回,返回,返回,一切正常。

但是,如果我这样做,替换为 fragment 1,添加 fragment 2,并替换为 fragment 3,然后按返回,返回,返回...。第三次按返回不再有效。为什么??

为了更好地说明这一点,我已将我的代码放在 github 中,如下所示 https://github.com/elye/issue_android_fragment_replace_add_replace

并记录到下面的 gif(63 秒 gif)中显示,4 个添加有效,4 个替换有效,但是替换和添加的混合,将导致工具栏后退按钮在几次后退后不起作用。

请注意添加 fragment 显示重叠数,因为背景是透明的。这样做是为了轻松区分添加与替换。

nhập mô tả hình ảnh ở đây

我怀疑这是一个谷歌错误,但我认为应该分享以防我错过任何重要的事情。

1 Câu trả lời

经过调查,问题确实如下所述。

因为每个 fragment 都有自己的操作栏集(在这个 stackoverflow 中,我将其简化为仅单击 R.id.home 以便更轻松地说明问题)。添加/删除 fragment 时,每个都会调用以下代码。

(activity as AppCompatActivity).setSupportActionBar(toolbar_actionbar)

当我们执行 add-add-replace(或 replace-add-replace)时......我们在后台堆栈中有 3 个 fragment ,但只有一个可见。因为最后一个替换,将删除前面的 2 个 fragment 。

当我们点击后退按钮时,最后被替换的 fragment 将被弹出,系统然后恢复前2个 fragment 。

在恢复前 2 个 fragment 的过程中,将在短时间内为两个 fragment 调用以下代码

(activity as AppCompatActivity).setSupportActionBar(toolbar_actionbar)

我怀疑这会导致第一个 fragment 的工具栏未完全设置的某些行为(Android SDK 错误?)。

为了解决这个问题,当我们再次弹出 2 个 fragment 时,我们必须强制调用第一个 fragment

(作为 AppCompatActivity 的 Activity ).setSupportActionBar(toolbar_actionbar)

针对上述问题,我的解决方法是将上面的代码放在 onResume() 中。

override fun onResume() {
super.onResume()
(activity as AppCompatActivity).setSupportActionBar(toolbar_actionbar)
}

每当一个fragment backstack改变时,我会调用top fragment的onResume

    supportFragmentManager.addOnBackStackChangedListener {
val currentFragment = supportFragmentManager.findFragmentById(R.id.container)
currentFragment?.onResume()
}

这现在有助于确保无论堆栈的替换添加混合情况如何,工具栏菜单都将继续工作。

我有示例解决方法代码 https://github.com/elye/issue_android_fragment_replace_add_replace_workaround

这实际上是一种解决方法,而不是解决方案。我希望发布一些更好的答案,或者如果这确实是 Google Bug,可以在以后的 SDK 版本中对其进行修复。

关于android - 替换、添加、替换 fragment ,然后导航后退按钮不适用于第一个 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48941001/

hai mươi bốn 4 0
Bài viết được đề xuất: android - 启动器 Activity 不工作的 FirebaseAuthStateListener
Bài viết được đề xuất: php - Laravel、homestead VM phpmyadmin 安装
Bài viết được đề xuất: android - AndEngine 动画之间的时长
Bài viết được đề xuất: javascript - 在 ES2015 中实现简单的属性继承?
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com