android - 替换 fragment 后,旧 fragment 的 View 仍保留在内容 View 中

标签 android android-fragments android-permissions

我遇到了一个奇怪的错误:在我的应用程序中,我有底部导航栏,它使用以下代码替换了 FrameLayout View 中的 fragment :

override fun setFragment(frag: Fragment, addToBackStack: Boolean) {
    FirebaseAnalytics.getInstance(this).setCurrentScreen(this, frag::class.java.simpleName, frag::class.java.simpleName)
    val ft = supportFragmentManager.beginTransaction()
            .setCustomAnimations(R.anim.fragment_in, R.anim.fragment_out, R.anim.fragment_in, R.anim.fragment_out)
            .replace(R.id.container, frag)

    if (addToBackStack) {
        viewModel.showNavigation = false
        ft.addToBackStack(null)
        supportActionBar?.setDisplayHomeAsUpEnabled(true)
    }

    ft.commit()
}

一切似乎都工作正常 - 但对于一个 fragment ,在 onCreateView 方法中我调用以下方法:

override fun requestPermissions(permissions: Array<String>, requestCode: Int) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        activity.requestPermissions(permissions, requestCode)
}

这会导致前一个 fragment 的 View 保留在屏幕上,并且新 fragment 将添加到它们的下方,如屏幕截图所示:

screenshot

更糟糕的是, View 将保留在屏幕中,直到 Activity 被终止。我能找到的唯一解决方法是在请求许可之前添加 0.5 秒的延迟:

Handler().postDelayed({ requestPermission(android.Manifest.permission.ACCESS_FINE_LOCATION, requestCode = REQUEST_PERMISSION_LOCATION) }, 500L)

我的问题是 - 有人知道这种行为的原因是什么以及是否有更好的方法来规避它

最佳答案

我的解决方案是按照 @Yolo 的原始问题评论中的建议在 xml 文件中设置背景颜色。

android:background="@android:color/white"

进行此更改后,当我切换到新 fragment 时,该 fragment 的 fragment 不再保留。

关于android - 替换 fragment 后,旧 fragment 的 View 仍保留在内容 View 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46564007/

相关文章:

android - 如何将图像从其 URL 传输到 SD 卡?

android - Android Context 的有效期是多久?

android - 哪里应该使用PageViewer?

android - 使用 SimpleAdapter 的 fragment 中的简单 ListView

android - 从应用程序类请求权限

java - 不从 fragment 调用 onRequestPermissionsResult

android - 单击几次后 SoundPool 不播放声音

android - 如何在android中使用迭代器获取Json键和值

android - fragment 单元测试 : launchFragment throws ClassCastException

android - FingerprintManager.isHardwareDetected() 抛出 java.lang.SecurityException?