【问题标题】:A view has already been added to the window manager视图已添加到窗口管理器
【发布时间】:2019-02-06 14:32:26
【问题描述】:

我的服务中有 2 个视图,我想根据某些情况切换它们。我正在做什么来进行切换,删除第一个视图,然后添加第二个视图。这是我的代码:

public void switchView(boolean toCallView) {
        if (toCallView) {
            if (lockScreenLayout != null && lockScreenLayout.getParent() != null && lockScreenLayout.getWindowToken() != null)
                windowManager.removeView(lockScreenLayout);
            if (callScreenLayout != null && callScreenLayout.getWindowToken() == null)
                windowManager.addView(callScreenLayout, layoutParams);
        } else {
            if (callScreenLayout != null && callScreenLayout.getParent() != null && callScreenLayout.getWindowToken() != null)
                windowManager.removeViewImmediate(callScreenLayout);
            if (lockScreenLayout != null && lockScreenLayout.getParent() != null && lockScreenLayout.getWindowToken() == null)
                windowManager.addView(lockScreenLayout, layoutParams); // exception raise here
        }
    }

但在某些情况下,我仍然会遇到应用程序崩溃,但出现以下异常:

ACRA caught a RuntimeException for com.myapp
java.lang.RuntimeException: Error receiving broadcast Intent { act=intent.activate.incoming.call.screen flg=0x10 (has extras) } in com.myapp.activity.LockScreenService$9@e94ff0a
    at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:895)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:234)
    at android.app.ActivityThread.main(ActivityThread.java:5524)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.IllegalStateException: View android.widget.RelativeLayout{d4d82ee V.E...... ......ID 0,0-720,1184} has already been added to the window manager.
    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:281)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:86)
    at com.myapp.util.IncomingCallHandler.switchView(IncomingCallHandler.java:73)
    at com.myapp.activity.LockScreenService$9.onReceive(LockScreenService.java:270)
    at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:885)
    ... 7 more

谁能给我提示如何避免这种情况。

【问题讨论】:

    标签: android android-view android-windowmanager


    【解决方案1】:

    如异常所述,lockScreenLayout 已添加到WindowManager,无法再次添加。因此,您有两种选择来防止这种情况:

    第一

    编辑你的逻辑。不应该出现你的某些条件被击中两次的情况

    第二

    检查视图是否已添加。像这样的:

    if (!lockScreenLayout.isShown()) 
    {
        // Add child to window
    }
    

    【讨论】:

    • 我理解你,但我不知道如何通过 WindowManager 检查视图是否已经存在或者是否有其他方法可以检查此信息?
    • windowManager中没有indexOfChild()方法
    • 好的...最后一次编辑。如果这不起作用,我不知道还能做什么。
    猜你喜欢
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 2014-05-20
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    相关资源
    最近更新 更多