我根据在线教程定义了一个自定义浮点视图组件,但问题是我每次调用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)
答案 0 :(得分:0)
当您每次都重新创建它时,新视图无法从视图中删除,因为它从未添加到“父”视图中。
答案 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);