Android AlertDialog 剩余 window 关闭后阻止输入
Android AlertDialog leftover window blocking input after dismiss
我正在开发一个 Amazon FireTV 应用程序,它依赖于作为自定义 AlertDialogs 实现的弹出菜单。出于样式原因,我使用的是 appcompat-v7:25.3.1
目前我在调试这个问题时遇到问题 运行:
如果我打开并关闭我的对话框 2 次,window 就会泄露,从而阻止 Amazon 远程输入事件。然后我需要按下后退按钮(关闭 window)让应用再次正确反应。
查看 Android Studio 的 LayoutInspector 我可以看到第二个,覆盖 window 是这个 class:android.support.v7.app.AppCompatDelegateImplV9$ListMenuDecorView@1b4b8967
logcat 显示以下条目(由 "Window" 过滤)
04-04 13:49:28.429 1906-2324/? V/WindowManager: not Base app: Adding window
Window{3663d4c0 u0 foo.bar/foo.bar.MainActivity} at 5 of 7
04-04 13:49:29.650 1906-2366/? W/InputMethodManagerService: Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@36117cec attribute=null, token = android.os.BinderProxy@348376a7
04-04 13:49:30.732 1906-2348/? V/WindowManager: not Base app: Adding window Window{2b864b4a u0 foo.bar/foo.bar.MainActivity} at 5 of 7
04-04 13:49:30.732 1906-2378/? V/WindowManager: Adding window Window{300f7bd8 u0 SubPanel:foo.bar/foo.bar.MainActivity} at 5 of 8 (after Window{164a9754 u0 foo.bar/foo.bar.MainActivity})
我的所有工作都在一个 activity (MainActivity) 上完成,我将其用作我显示的每个警报对话框的上下文。我没有使用 DialogFragments,因为我不需要对弹出菜单进行花哨的生命周期处理。
如果有人能指出我正确的方向,我会很高兴!
所以我找到了问题的原因:
收到菜单按钮事件后我忘记了returntrue,意思是不将其标记为已消费。因为我使用 AppCompatActivity 而没有设置或显示 actionbar 出于某种原因 appcompat 试图显示一个菜单并在顶部覆盖一个透明 window,然后在关闭对话框后仍然可见。
Logn 故事短片:在使用按键事件后总是 return true ;)
我正在开发一个 Amazon FireTV 应用程序,它依赖于作为自定义 AlertDialogs 实现的弹出菜单。出于样式原因,我使用的是 appcompat-v7:25.3.1
目前我在调试这个问题时遇到问题 运行: 如果我打开并关闭我的对话框 2 次,window 就会泄露,从而阻止 Amazon 远程输入事件。然后我需要按下后退按钮(关闭 window)让应用再次正确反应。
查看 Android Studio 的 LayoutInspector 我可以看到第二个,覆盖 window 是这个 class:android.support.v7.app.AppCompatDelegateImplV9$ListMenuDecorView@1b4b8967
logcat 显示以下条目(由 "Window" 过滤)
04-04 13:49:28.429 1906-2324/? V/WindowManager: not Base app: Adding window
Window{3663d4c0 u0 foo.bar/foo.bar.MainActivity} at 5 of 7
04-04 13:49:29.650 1906-2366/? W/InputMethodManagerService: Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@36117cec attribute=null, token = android.os.BinderProxy@348376a7
04-04 13:49:30.732 1906-2348/? V/WindowManager: not Base app: Adding window Window{2b864b4a u0 foo.bar/foo.bar.MainActivity} at 5 of 7
04-04 13:49:30.732 1906-2378/? V/WindowManager: Adding window Window{300f7bd8 u0 SubPanel:foo.bar/foo.bar.MainActivity} at 5 of 8 (after Window{164a9754 u0 foo.bar/foo.bar.MainActivity})
我的所有工作都在一个 activity (MainActivity) 上完成,我将其用作我显示的每个警报对话框的上下文。我没有使用 DialogFragments,因为我不需要对弹出菜单进行花哨的生命周期处理。
如果有人能指出我正确的方向,我会很高兴!
所以我找到了问题的原因:
收到菜单按钮事件后我忘记了returntrue,意思是不将其标记为已消费。因为我使用 AppCompatActivity 而没有设置或显示 actionbar 出于某种原因 appcompat 试图显示一个菜单并在顶部覆盖一个透明 window,然后在关闭对话框后仍然可见。
Logn 故事短片:在使用按键事件后总是 return true ;)