【问题标题】:WindowManager.removeView() gives IllegalStateExceptionWindowManager.removeView() 给出 IllegalStateException
【发布时间】:2014-09-20 19:25:54
【问题描述】:

我正在尝试创建一个仅在打开特定应用程序时才显示的自定义聊天头。 (例如 Messenger 或 WhatsApp)。并且会在该应用程序关闭时被销毁。

这是我的代码-

@Override
public void onCreate() {
    super.onCreate();

    windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

    chatHead = new ImageView(this);
    chatHead.setImageResource(R.drawable.view_icon);

    final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);

    params.gravity = Gravity.TOP | Gravity.START;
    params.x = 0;
    params.y = 100;

    windowManager.addView(chatHead, params);

    getForeground();


    chatHead.setOnClickListener(new View.OnClickListener() {
       /*.....
         .....
         ClickListener implemented
         .....
         .....
       */
    });

}

这里,在onCreate() 中,我调用了getForeground() 方法,该方法在前台获取当前活动

public String getForeground() {
    final ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
    String foreground = am.getRunningTasks(1).get(0).topActivity.getPackageName();
    if (foreground.equals("com.whatsapp")) {
        if (chatHead==null)
            onResume();
    }
    else
        onDestroy();

    new Thread() {
        @Override
        public void run() {
            getForeground();

        }
    }.start();
    return foreground;
}

onResume() 在哪里-

public void onResume() {
    final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);

    params.gravity = Gravity.TOP | Gravity.START;
    params.x = 0;
    params.y = 100;

    windowManager.addView(chatHead,params);
}

onDestroy() 是-

@Override
public void onDestroy() {
    super.onDestroy();
    if (chatHead != null)
        windowManager.removeView(chatHead);
    else
        chatHead=null;
}

但是,它显示IllegalStateException 如下-

java.lang.IllegalArgumentException: View=android.widget.ImageView{41f07a28 V.ED..C. ......ID 0,0-93,99} not attached to window manager
            at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:370)
            at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:299)
            at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:79)
            at automated.whatsapp.com.automatedtest.ChatHeadService.onDestroy(ChatHeadService.java:172)
            at automated.whatsapp.com.automatedtest.ChatHeadService.getForeground(ChatHeadService.java:188)
            at automated.whatsapp.com.automatedtest.ChatHeadService$3.run(ChatHeadService.java:194)

因此,基本上,它表示chatHead 未附加到WindowManager。如何更正此错误?

【问题讨论】:

    标签: android android-windowmanager


    【解决方案1】:

    您可以像这样在窗口管理器周围使用 try-catch

    try{
        WindowManager?.removeView(view);
    }catch(e:Exception){
        Log.e(debug_tag, "view not found");
    }
    

    或者可以检查view的windowtoken是否存在

    if (view?.windowToken!=null) {
       WindowManager?.removeView(view);
    }
    

    因为当您的视图未添加或稍后删除视图时,您的窗口管理器会产生新的异常

    【讨论】:

      【解决方案2】:

      不确定这是否可以帮助您,但这是我所做的:

      @Override
      protected void onUserLeaveHint() {
          if (this.chatHead != null) {
              this.runOnUiThread(new Runnable() {
                  @Override
                  public void run() {
                      ((WindowManager) getApplicationContext().getSystemService(Service.WINDOW_SERVICE)).removeView(chatHead);
                  }
              });
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-04
        • 1970-01-01
        • 2018-09-02
        • 1970-01-01
        • 2020-06-25
        • 2019-05-04
        • 2019-06-10
        • 2015-02-15
        相关资源
        最近更新 更多