2016-03-12 31 views
0

我正在使用浮動管理器繪製浮動。並在整個屏幕上拖動浮動按鈕。它工作正常,並且順利拖動。但是當我不斷點擊浮動按鈕我的應用程序崩潰。我不知道發生了什麼事。 有沒有辦法找出問題發生的原因? 我如何防止這種情況發生? 幫幫我! 在此先感謝使用浮動窗口管理器應用程序崩潰持續點擊

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

跳過處理操作移動事件,如果你已經點擊美景。

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; 
    } 
相關問題