为什么 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缓存+重启,
- 正在从所有设备上卸载所有内容。
- 正在清除测试数据库(以防万一)。
- 正在重启所有设备。
这似乎是解决方案。
在尝试解决由 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缓存+重启,
- 正在从所有设备上卸载所有内容。
- 正在清除测试数据库(以防万一)。
- 正在重启所有设备。
这似乎是解决方案。