gpt4 book ai didi

android - 使用 Floating Window Manager App 在连续点击时崩溃

转载 作者:行者123 更新时间:2023-11-30 01:29:36 27 4
gpt4 key购买 nike

我在 Float Manager 中使用 Float drawable。并在整个屏幕中拖动 float 按钮。它工作完美,拖动流畅。但是当我连续点击 float 按钮时,我的应用程序崩溃了。我不知道发生了什么。有没有办法找出这个问题发生的确切原因?我该如何防止这种情况发生?帮我!提前致谢

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)

最佳答案

如果您已经单击了 View ,则跳过处理 Action 移动事件。

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;
}

关于android - 使用 Floating Window Manager App 在连续点击时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35957752/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com