gpt4 book ai didi

android - PopupWindow 不响应拖放事件

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:59:30 29 4
gpt4 key购买 nike

我的应用程序中有一个菜单图标。当我在上面拖放某些东西时,它会显示一个弹出窗口。我需要将拖放扩展到此 PopupWindow

我正在这样做,如下所示。

如图所示创建了一个 PopupWindow

View popupView = View.inflate(anchorView.getContext(), R.layout.layout_popup, null);

PopupWindow popUpWindow = new PopupWindow(popupView, WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT);

并如图所示设置 dragListener

popupView.setOnDragListener(new OnDragListener() {
@Override
public boolean onDrag(View view, DragEvent dragEvent) {



switch (dragEvent.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
Log.d("Drag", "ACTION_DRAG_STARTED");
break;
case DragEvent.ACTION_DRAG_ENDED:
Log.d("Drag", "ACTION_DRAG_ENDED");
break;
case DragEvent.ACTION_DRAG_ENTERED:
Log.d("Drag", "ACTION_DRAG_ENTERED");
break;
case DragEvent.ACTION_DRAG_EXITED:
Log.d("Drag", "ACTION_DRAG_EXITED");
break;
case DragEvent.ACTION_DROP:
Log.d("Drag", "ACTION_DROP");
break;
default:
break;
}

return true;
}
});

下面的视频显示了我想要实现的目标。

enter image description here

但是 popupView 没有响应任何拖动事件。我也尝试使用 DialogFragment,但也没有用。感谢您的帮助。

提前致谢。

最佳答案

PopupWindowadd the View on WindowManager instance , 而不是当前布局。鉴于 in the docs它被指定:

The system sends a drag event with action type ACTION_DRAG_STARTED to the drag event listeners for all the View objects in the current layout.

注意加粗的“在当前布局中”。 PopupWindow的内容 View 不被认为在当前布局中,这就是为什么这些事件不会被发送到 PopupWindow 的原因的内容 View 。

作为解决方法,您可以添加 View与当前布局具有相同的坐标,这将充当 PopupWindow 的幽灵,并监听此 View 的拖动事件.


实现

幽灵 View 添加到布局中:

<include android:id="@+id/ghost"
layout="@layout/layout_popup"/>

onCreate() 设置幽灵 View :



private void setupGhostView() {
ghost = findViewById(R.id.ghost);
ghost.setAlpha(0.0f);
ghost.findViewById(R.id.txt_append).setOnDragListener(new OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
if (event.getAction() == DragEvent.ACTION_DROP) {
Toast.makeText(MainActivity.this, "Settings 1", Toast.LENGTH_SHORT).show();
}
return true;
}
});
ghost.findViewById(R.id.txt_replace).setOnDragListener(new OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
if (event.getAction() == DragEvent.ACTION_DROP) {
Toast.makeText(MainActivity.this, "Settings 2", Toast.LENGTH_SHORT).show();
}
return true;
}
});
}

我们希望幽灵 View 可见,这就是我们将其 alpha 设置为零的原因。

然后我们设置 PopupWindow有 anchor View :



private void preparePopup(View anchorView) {
final View popupView = View.inflate(anchorView.getContext(), R.layout.layout_popup, null);
popupView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));

popupWindow = new PopupWindow(popupView, WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT);
popupWindow.setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
popupWindow.setTouchable(false);

FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
popupView.getMeasuredWidth(), popupView.getMeasuredHeight());
params.gravity = Gravity.END;
ghost.setLayoutParams(params);
ghost.invalidate();
ghost.requestLayout();
}

我们需要执行 setTouchable(false) , 否则 PopupWindow会消耗触摸事件。此外,我们将 ghost view 的位置精确设置在 PopupWindow 的位置。将显示。

然后我们展示并驳回PopupWindow在适当的拖动事件上:



menuView.setOnDragListener(new OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
int dragEvent = event.getAction();
switch (dragEvent) {

case DragEvent.ACTION_DRAG_ENTERED:
popupWindow.showAsDropDown(anchorView);
break;

case DragEvent.ACTION_DRAG_ENDED:
popupWindow.dismiss();
break;
}

return true;
}
});

结果

enter image description here

拉取请求 is opened在具有上述功能的代码库中。

关于android - PopupWindow 不响应拖放事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43757231/

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