为什么 DialogFragment 的默认透明度没有覆盖屏幕的一部分?

Why is a portion of the screen not been covered by the default transparency of the DialogFragment?

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

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

加上对对话框生命周期内的 onStart()、onStop()、onDestroy() 的各种覆盖。在 Activity.

上覆盖 onDestroy() 和 onCreate()

GlobalLayoutListener 和 GlobalFocusChangeListener 的 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 上的最后一个版本是在上周之前提交的,该版本致力于修复一些内存泄漏问题,这些问题被认为很容易修复,但最终在一些大修中发生了转变,所以我不不认为这是一个选择...

首先在 Samsung j7 Pro 上应用的更改,并且对话框完全正常工作。

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

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

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

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

这似乎是一个 API 级别的问题,我知道 4.4.4 - 6.0 都有奇怪和不一致的 UI 怪癖。虽然你说你恢复了它,但可能有一些非常小的、“无关的”、看似良性的配置更改。

与此同时,由于您愿意解决问题,这可能会对您有所帮助。 DialogFragment with clear background (not dimmed) 您可以手动将 window 设置为暗淡,这可能会覆盖导致它的任何原因。如果这不起作用,您可以将 window 设置为完全不暗淡,然后您就无法区分。您甚至可以将其限制为三星 J5 API 级别。

嗯,解决办法就是忘掉一切,洗个澡,吃点药然后睡觉。

还有一些重要提示:

  • 正在优化导入以清除任何额外的导入。
  • ".txt" 不需要的所有内容。
  • 评论不需要的所有内容。
  • 清除AS缓存+重启,
  • 正在从所有设备上卸载所有内容。
  • 正在清除测试数据库(以防万一)。
  • 正在重启所有设备。

这似乎是解决方案。