2017-09-22 32 views
0

我有一个视图,我添加到窗口管理器。将在我检查它是否已经在计算器另一个问题添加到窗口管理器,例如:查看已被添加到窗口管理器

protected void addViewToWindow(@NonNull OverlayLayout view) { 
    if (view.getWindowToken() == null) { 
     handler.post(() -> windowManager.addView(view, view.getViewParams())); 
    } 
} 

但在与Android 5某些设备有此异常:

View has already been added to the window manager. 
     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:243) 
     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:145) 
     at android.app.ActivityThread.main(ActivityThread.java:5942) 
     at java.lang.reflect.Method.invoke(Method.java) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 

哪有我解决这个问题?请帮助我

+0

看起来你正在调用'addViewToWindow'以查看系统后来尝试附加到窗口管理器。你能编辑你的问题来解释你在哪里调用这个方法吗? – Haem

+0

注意: - 为什么如果您已经使用此符号@NonNull检查条件,则再次检查null。 – sushildlh

+0

@HeikkiMäenpää我只需要检查这个视图是否已经附加 – shmakova

回答

2

在调用handler.post之后,您正在检查视图是否已附加到窗口。视图最终会附在您的支票和Looper处理您的回拨之间。您应该将支票if (view.getWindowToken() == null)转移到您传递给post的回拨中,因此在您尝试将视图附加到窗口之前会立即进行检查。

相关问题