代码之家  ›  专栏  ›  技术社区  ›  KubaK

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

  •  2
  • KubaK  · 技术社区  · 7 年前

    我遇到了一个特殊的错误:在我的应用程序中,我有一个底部导航栏,它使用以下代码替换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 回复  |  直到 7 年前
        1
  •  2
  •   Forrest    4 年前

    我的解决方案是在 xml 按照@Yolo在原始问题评论中提出的建议归档。

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

    在我做了这个改变之后,当我切换到新的片段时,这个片段的片段不再挂起。