removeView(mView)抛出illegalArgumentException

时间:2014-01-22 23:29:59

标签: android view overlay illegalargumentexception

我根据在线教程定义了一个自定义浮点视图组件,但问题是我每次调用removeView()时都会出现异常,其他部分工作正常,以下是onclick监听器。

  followButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          ImageView focusView = new ImageView(getActivity());
          focusView.setImageResource(R.drawable.follow_me);
          WindowManager.LayoutParams focusParam = new WindowManager.LayoutParams();
          focusParam.type=2002;
          focusParam.format=1;
          focusParam.flags=40;  //default(32)+ FLAG_NOT_FOCUSABLE(8)
          focusParam.width=30;
          focusParam.height=30;
          focusParam.x=0;focusParam.y=0;
          focusParam.setTitle("Load Average");
          WindowManager wm1 = (WindowManager)getActivity().getSystemService(Context.WINDOW_SERVICE);              
            followModeOn=!followModeOn;
            if (followModeOn) {
                  wm1.addView(focusView, focusParam);
            }
            else {
                wm1.removeView(focusView);
            }
        }
    });

以下是错误报告:

01-23 00:06:39.163: E/AndroidRuntime(31651): java.lang.IllegalArgumentException: View=android.widget.ImageView{46586dc0 V.ED.... ......I. 0,0-0,0} not attached to window manager
01-23 00:06:39.163: E/AndroidRuntime(31651):    at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:370)
01-23 00:06:39.163: E/AndroidRuntime(31651):    at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:299)
01-23 00:06:39.163: E/AndroidRuntime(31651):    at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:79)
01-23 00:06:39.163: E/AndroidRuntime(31651):    at study.runtracker.map.OSMFragment$4.onClick(OSMFragment.java:180)
01-23 00:06:39.163: E/AndroidRuntime(31651):    at android.view.View.performClick(View.java:4438)
01-23 00:06:39.163: E/AndroidRuntime(31651):    at android.view.View$PerformClick.run(View.java:18422)
01-23 00:06:39.163: E/AndroidRuntime(31651):    at android.os.Handler.handleCallback(Handler.java:733)
01-23 00:06:39.163: E/AndroidRuntime(31651):    at android.os.Handler.dispatchMessage(Handler.java:95)
01-23 00:06:39.163: E/AndroidRuntime(31651):    at android.os.Looper.loop(Looper.java:136)
01-23 00:06:39.163: E/AndroidRuntime(31651):    at android.app.ActivityThread.main(ActivityThread.java:5017)
01-23 00:06:39.163: E/AndroidRuntime(31651):    at 

java.lang.reflect.Method.invokeNative(Native Method)

01-23 00:06:39.163: E/AndroidRuntime(31651):    at java.lang.reflect.Method.invoke(Method.java:515)
01-23 00:06:39.163: E/AndroidRuntime(31651):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
01-23 00:06:39.163: E/AndroidRuntime(31651):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
01-23 00:06:39.163: E/AndroidRuntime(31651):    at dalvik.system.NativeStart.main(Native Method)

3 个答案:

答案 0 :(得分:0)

这是不行的。每次收到点击时,您都在创建一个新的ImageView,您需要保留对首先创建的ImageView的引用。

当您每次都重新创建它时,新视图无法从视图中删除,因为它从未添加到“父”视图中。

答案 1 :(得分:0)

正如Log cat所说,focusView尚未附加到WindowManager。您正在创建一个全新的ImageView,然后在附加它之前尝试将其删除。

我会尝试保留对focusView的引用,以便稍后将其删除。

View mFocusView = null;

followButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Create the focus view, if not already done
        if (mFocusView == null)
            mFocusView = new ImageView(getActivity());

        mFocusView.setImageResource(R.drawable.follow_me);
        WindowManager.LayoutParams focusParam = new WindowManager.LayoutParams();
        focusParam.type=2002;
        focusParam.format=1;
        focusParam.flags=40;  //default(32)+ FLAG_NOT_FOCUSABLE(8)
        focusParam.width=30;
        focusParam.height=30;
        focusParam.x=0;focusParam.y=0;
        focusParam.setTitle("Load Average");
        WindowManager wm1 = (WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE);

        followModeOn=!followModeOn;
        // This will work as long as followModeOn is false here, the first pass through.
        if (followModeOn) {
            wm1.addView(mFocusView, focusParam);
        }
        else {
            wm1.removeView(mFocusView);
        }
    }
});

答案 2 :(得分:0)

感谢您的建议,现在我将一个构造函数移出onclick并解决了问题。

      ImageView focusView = new ImageView(getActivity());
        @Override
        public void onClick(View v) {             
          focusView.setImageResource(R.drawable.follow_me);