更换片段后,旧片段的视图仍保留在内容视图中

时间:2017-10-04 11:44:37

标签: android android-fragments android-permissions

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

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

一切似乎都运行良好 - 但对于一个片段,在onCreateView方法中我调用以下方法:

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

这会导致前一个片段的视图保留在屏幕上,新片段将被添加到下面,如屏幕截图所示:

screenshot

更糟糕的是,在活动被杀之前,视图将保留在屏幕上。我能找到的唯一解决方法是在要求许可之前添加0.5秒的延迟:

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

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

1 个答案:

答案 0 :(得分:0)

对我来说,解决方案是按照@Yolo原始问题注释中的建议在xml文件中设置背景颜色。

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

进行此更改后,当我切换到新片段时,该片段的片段不再徘徊。