2014-01-22 56 views
0

我根据网上教程定义一个定制的浮动视图组件,但问题是,每次我打电话removeView(),有一个例外,所有其他部分工作正常,以下是的onclick监听器。removeView(MVIEW)抛出一个抛出:IllegalArgumentException

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) 

回答

0

这个斜面工作。您每次收到点击时都会创建一个新的ImageView,因此您需要保留一个参考资料,以便首先创建该参考资料。

当你在每次重新创建新认为不能从视图,因为它从来没有被添加到“父”视图中删除。

0

作为日志猫说:focusView尚未连接到窗口管理器。您正在创建一个全新的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); 
     } 
    } 
}); 
0

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

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