DialogFragment UI 解雇后仍然存在
DialogFragment UI still remains after dismiss
我有一个自定义对话框片段,我面临的问题是当调用关闭函数时,对话框 UI 仍然保留在屏幕上,即使它实际上被关闭了。
onDismiss
函数也被调用,但 UI 仍然位于父片段上。
这是我的对话框class
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>
它神奇地解决了这个问题!
我有一个自定义对话框片段,我面临的问题是当调用关闭函数时,对话框 UI 仍然保留在屏幕上,即使它实际上被关闭了。
onDismiss
函数也被调用,但 UI 仍然位于父片段上。
这是我的对话框class
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>
它神奇地解决了这个问题!