关闭后 DialogFragment UI 仍然存在

问题描述

我有一个自定义对话框片段,我面临的问题是,当调用关闭函数时,对话框 UI 仍然保留在屏幕上,即使它实际上已被关闭ondismiss 函数也被调用,但 UI 仍然位于父片段上。

这是我的对话课

class IAPDialogFragment : DaggerDialogFragment() {
// Listener
var onSuccessfulIAP: (IAPDialogFragment.() -> Unit)? = null

override fun getTheme(): Int = R.style.DialogTheme

override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? =
    inflater.inflate(R.layout.iap_dialog,container,false)

override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
    super.onViewCreated(view,savedInstanceState)
    iap_dialog?.applyOutlineCornerRadius(30)

    setState(state,errorReason)
    action_button.setonClickListener {
        dismiss()
    }
}

override fun ondismiss(dialog: DialogInterface) {
    super.ondismiss(dialog)
    if (this.state == State.SUCCESS) {
        onSuccessfulIAP?.invoke(this)
    }
}

fun setState(state: State,errorReason: IapException? = null) = apply {
    this.state = state
    this.errorReason = errorReason

    when (state) {
        State.LOADING -> {
            isCancelable = false
            action_button?.visibility = View.GONE
        }
        State.SUCCESS -> {
            isCancelable = true
            action_button?.visibility = View.VISIBLE
            iap_dialog?.setBackgroundResource(R.drawable.iap_card_success_background)
        }
        State.ERROR -> {
            isCancelable = true
            action_button?.visibility = View.VISIBLE
        }
    }
}

这是父片段:

class IAPFragment : DaggerFragment(){
private val dialog = IAPDialogFragment()

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    billingviewmodel.state.observe(viewLifecycleOwner) { state ->
        when (state) {
            State.OFFERS_LOADING -> showLoadingState()
            State.OFFERS_LOADING_Failed -> showEmptyState()
            State.OFFERS_LOADED -> showOffers(billingviewmodel.skuList)
            State.PURCHASING -> dialog.setState(LOADING)
            State.PURCHASING_SUCCESS -> dialog.setState(SUCCESS)
            State.PURCHASING_Failed -> dialog.setState(ERROR,billingviewmodel.errorReason)
            else -> showEmptyState()
        }
    }
}

private fun updateButton(position: Int) {
    subscribe_button.apply {
        setonClickListener {
            dialog.setState(LOADING)
            dialog.show(childFragmentManager,LOADING.name)
        }
    }
}

我做错了什么吗? DialogFragment 解除后有没有办法刷新 UI 状态?

解决方法

经过数小时的调查,我终于发现样式中的动画是问题所在。显然,DaggerDialogFragments 与 android:windowAnimationStyle 存在兼容性问题。 我使用的风格是:

<style name="DialogTheme" parent="AppTheme">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">false</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:backgroundDimEnabled">false</item>
    <item name="android:windowAnimationStyle">@style/DialogAnimation</item>
</style>

<style name="DialogAnimation">
    <item name="android:windowEnterAnimation">@anim/fragment_fade_enter</item>
    <item name="android:windowExitAnimation">@anim/fragment_fade_exit</item>
</style>

我改成:

<style name="DialogTheme" parent="AppTheme">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">false</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:backgroundDimEnabled">false</item>
    <item name="android:windowEnterAnimation">@anim/fragment_fade_enter</item>
    <item name="android:windowExitAnimation">@anim/fragment_fade_exit</item>
</style>

它神奇地解决了这个问题!