使用Floating Window Manager App崩溃时,请继续点击

时间:2016-03-12 12:41:24

标签: android android-studio service

我在Float Manager中使用Float drawable。并在整个屏幕中拖动浮动按钮。它工作得很好,拖得很顺利。但是,当我不断点击浮动按钮我的应用程序崩溃。我不知道发生了什么。 有没有办法找出这个问题究竟发生的原因? 我该如何防止这种情况发生? 帮我! 提前致谢

public class ServiceFloating extends Service {

    private WindowManager windowManager;
    private boolean mHasDoubleClicked = false;
    private long lastPressTime;
    private LayoutInflater layoutInflater;
    private View floatView;
    public DBHelper dbHelper;
    public static TextView txtCartCount;
    private int countProduct;
    private int isClick = 0;
    private static final int MAX_CLICK_DURATION = 200;
    private long startClickTime;
    private boolean mIsClicked = false;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        dbHelper = new DBHelper(getApplicationContext());
        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.BOTTOM | Gravity.RIGHT;
        params.x = 20;
        params.y = 20;

        layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
        floatView = layoutInflater.inflate(R.layout.floating_cart, null);

        windowManager.addView(floatView, params);

        try {
            floatView.setOnTouchListener(new View.OnTouchListener() {
                private WindowManager.LayoutParams paramsF = params;
                private int initialX;
                private int initialY;
                private float initialTouchX;
                private float initialTouchY;

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                            long pressTime = System.currentTimeMillis();
                            startClickTime = Calendar.getInstance().getTimeInMillis();
                            if (pressTime - lastPressTime <= 300) {
                                mHasDoubleClicked = true;
                            } else {     // If not double click....
                                mHasDoubleClicked = false;
                            }
                            lastPressTime = pressTime;
                            initialX = paramsF.x;
                            initialY = paramsF.y;
                            initialTouchX = event.getRawX();
                            initialTouchY = event.getRawY();
                            break;
                        case MotionEvent.ACTION_UP:

                            long clickDuration = Calendar.getInstance().getTimeInMillis() - startClickTime;
                            if (clickDuration < MAX_CLICK_DURATION) {
                                //click event has occurred
                                if (!mIsClicked) {
                                    mIsClicked = true;
                                    Intent mIntent = new Intent(ServiceFloating.this, Cart.class);
                                    mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                    startActivity(mIntent);
                                }
                            }

                            break;
                        case MotionEvent.ACTION_MOVE:
                            paramsF.x = initialX - (int) (event.getRawX() - initialTouchX);
                            paramsF.y = initialY - (int) (event.getRawY() - initialTouchY);
                            windowManager.updateViewLayout(floatView, paramsF);
                            break;
                    }
                    return true;
                }
            });
        } catch (Exception e) {
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        stopService(new Intent(ServiceFloating.this, ServiceFloating.class));
        if (floatView != null) {
            windowManager.removeView(floatView);
        }
    }
}

应用崩溃错误

java.lang.IllegalArgumentException: View not attached to window manager
  at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:425)
  at android.view.WindowManagerGlobal.updateViewLayout(WindowManagerGlobal.java:314)
  at android.view.WindowManagerImpl.updateViewLayout(WindowManagerImpl.java:78)
  at com.vrin.sga.Service.ServiceFloating$1.onTouch(ServiceFloating.java:126)
  at android.view.View.dispatchTouchEvent(View.java:7812)
  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2435)
  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2159)
  at android.view.View.dispatchPointerEvent(View.java:8025)
  at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4668)
  at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4556)
  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4150)
  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4207)
  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4176)
  at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4261)
  at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4184)
  at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4318)
  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4150)
  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4207)
  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4176)
  at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4184)
  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4150)
  at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6302)
  at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6240)
  at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6211)
  at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6382)
  at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:188)
  at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
  at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:177)
  at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:6355)
  at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:6401)
  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:791)
  at android.view.Choreographer.doCallbacks(Choreographer.java:591)
  at android.view.Choreographer.doFrame(Choreographer.java:559)
  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:777)
  at android.os.Handler.handleCallback(Handler.java:730)
  at android.os.Handler.dispatchMessage(Handler.java:92)
  at android.os.Looper.loop(Looper.java:176)
  at android.app.ActivityThread.main(ActivityThread.java:5419)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:525)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
  at dalvik.system.NativeStart.main(Native Method)

1 个答案:

答案 0 :(得分:1)

如果您已经点击了视图,则跳过处理操作移动事件。

case MotionEvent.ACTION_MOVE:
     //click event has occurred
     if (!mIsClicked) {
        paramsF.x = initialX - (int) (event.getRawX() - initialTouchX);
        paramsF.y = initialY - (int) (event.getRawY() - initialTouchY);
        windowManager.updateViewLayout(floatView, paramsF);
        break;
     }