2017-09-22 3 views
0

私はウィンドウマネージャーに追加するビューを持っています。それはすでにstackoverflowの上の別の質問のように、ウィンドウマネージャに追加されている場合は追加する前に私がチェックします。ビューはすでにウィンドウマネージャーに追加されています

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

しかし、アンドロイド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があなたのコールバックを処理したときに、ビューが結ばれてしまいます。チェックをpostに渡すコールバックにチェックif (view.getWindowToken() == null)を移動する必要があります。このチェックは、ウィンドウにビューをアタッチしようとする直前に行われます。

関連する問題