首页 > 解决方案 > 为什么DialogFragment的默认透明度没有覆盖屏幕的一部分?

问题描述

在尝试解决从 DialogFragment 触发时由键盘引起的 InputMethodManager的内存泄漏问题。以及 imputMethodManager + Dialogs + configurationChanges 的其他相关问题,其中包括对清单的更改,例如:

android:windowSoftInputMode="adjustPan"
android:windowSoftInputMode="adjustPan|stateUnchanged"

加上 Dialog 的 LifeCycle 中对 onStart()、onStop()、onDestroy() 的各种覆盖。覆盖 Activity 上的 onDestroy() 和 onCreate()。

GlobalLayoutListener's 和 GlobalFocusChangeListener's with Handlers 也在其中进行了测试。

大部分(全部)更改已被丢弃,因为它们不起作用。

屏幕的一部分开始出现没有被项目的所有对话框片段上的 DialogFragment 的默认透明度覆盖,其中包括:DialogFragment.class、AppCompatDialogFragment.class 和普通 AlertDialog.Builder()

我试图回滚所有更改,最后这些更改最终成为 FragmentActivity 中的一行:

@Override
protected void onDestroy() {
    super.onDestroy();
    ViewToolUtils.fixInputMethod(this);
}

它使用反射来访问泄漏字段。

Field declaredField = inputMethodManager.getClass().getDeclaredField("mCurRootView");
                if (declaredField == null) continue;
                if (!declaredField.isAccessible()) {
                    declaredField.setAccessible(true);
                }
                Object obj = declaredField.get(inputMethodManager);
                ...
                declaredField.set(inputMethodManager, null);

,但屏幕的未覆盖部分仍然存在。

遗憾的是,git 上的最后一个版本是在上周之前提交的,它致力于修复一些被认为很容易修复但最终在一些大修中转变的内存泄漏问题,所以我不认为这是一个选择......

最初应用于三星 j7 Pro 的更改,并且对话框完全正常工作。

但是,当在三星 J5 上测试更改时,该项目从未在该设备上恢复正常,即使所有更改都被回滚,缓存被无效并重新启动。

这两款设备都参与了此过程,并且在应用此特定修复程序后出现了此问题的第一个迹象。

在此处输入图像描述

非常可疑的是,白色未覆盖的部分实际上类似于键盘……尽管小了几毫米。

我不介意如果我可以将不透明度一直强制降低或完全禁用它,此时我不在乎......,我有点绝望。

标签: androidbackgroundtransparencyandroid-dialogfragment

解决方案


看起来这可能是一个 API 级别的问题,我知道4.4.4 - 6.0所有人都有奇怪和不一致的 UI 奇怪之处。尽管您说您已将其还原,但可能会有一些非常小的、“不相关的”、看似良性的配置更改。

同时,由于您可以进行变通,这可能会对您有所帮助。具有清晰背景的 DialogFragment(未变暗)您可以手动将窗口设置为变暗,这可能会覆盖导致它的任何原因。如果这不起作用,您可以将窗口设置为完全不暗淡,然后您就无法区分。您甚至可以将其限制为 Samsung J5 API 级别。


推荐阅读