- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的应用程序中有一个菜单图标。当我在上面拖放某些东西时,它会显示一个弹出窗口。我需要将拖放扩展到此 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;
}
});
下面的视频显示了我想要实现的目标。
但是 popupView 没有响应任何拖动事件。我也尝试使用 DialogFragment
,但也没有用。感谢您的帮助。
提前致谢。
最佳答案
PopupWindow
将add 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;
}
});
拉取请求 is opened在具有上述功能的代码库中。
关于android - PopupWindow 不响应拖放事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43757231/
我想在另一个 PopUpWindow 中打开一个 PopUpWindow。我的 MainActivity 中有一个 ImageButtons。当我单击它时,会出现一个 PopUpWindow。我在我的
在 Honeycomb 应用程序中,我在多个地方使用 PopupWindow 的自定义子类来显示各种 View 。这一切都很好,直到其中一个 View 碰巧尝试显示另一个 PopupWindow。 例
android PopupWindow 可以显示另一个 PopupWindow 吗?可以同时打开多少个 PopupWindow?只有一个? 第一个PopupWindow正常显示。但是在单击按钮时(在第
在我的应用程序中,我试图将包含 popupwindow 的 View 设置为不可见,并在一段时间后设置为可见。我的弹出窗口包含图像和文本,我希望弹出窗口的整个 View 及其内容根据某种逻辑显示和不显
当从单独的类调用 PopupWindow 方法时,我希望能够从 xml 文件定义 PopupWindow 中的布局。下面的代码根据需要工作,除了布局是从 java 文件而不是 xml 文件中提取的。在
谷歌开发团队的人能解释一下如何避免在 pre-ics 设备上发生这种崩溃吗?在我的例子中,ListView 项目上的 ImageButton 是 PopupWindow 的 anchor ,用于创建下
PopupWindow 膨胀得很好,直到它接近屏幕底部,它被切断了。有谁知道当它接近屏幕底部时如何让它向上膨胀? public SelectBucketMenu(Context context) {
这个问题已经有答案了: Android popup window dismissal (11 个回答) 已关闭 9 年前。 我创建了弹出窗口 public void myPopUp() {
要创建一个简单的工作 PopupWindow,我们需要执行以下操作: popup_example.xml: Java代码 LayoutInflater infl
有 PopupWindow 的 xml 文件: 如何以编程方式替换此 xml 中的图标和背景? 最佳答案 LinearLayout menuLayout= (LinearLayout) activit
要创建一个简单的工作 PopupWindow,我们需要执行以下操作: popup_example.xml: Java代码 LayoutInflater infl
我想在向其添加布局之前让 PopupWindow 至少显示一个空矩形。 这不起作用: public void configure() { LinearLayout linearLayout =
我在使用 PopupWindow android 默认小部件时遇到了问题。当我触摸按钮显示弹出窗口而不是按手机上的后退按钮时,在显示弹出窗口之前,我有强制关闭消息,接下来是错误: 10-14
如何将键事件从可聚焦的 PopupWindow 分派(dispatch)到基础 Activity。如果我设置窗口可聚焦,它会消耗所有事件。我希望能够拦截一个 key ,并处理事件。 这是我的困境:我的
我想通过点击窗口外部或按下后退按钮来关闭 PopupWindow。现在你可以点击屏幕上的任何地方,窗口会关闭,我不明白为什么。我还想给 PopupWindow 添加一个阴影。谢谢! 主要 Activi
在我的一个 Activity 中,有一个按钮,单击它会打开一个PopupWindow。我的 Intent 是,当 PopupWindow 打开并且用户单击屏幕上弹出区域以外的任何地方时,应该关闭 Po
目前,我在线性布局中有一个按钮,如下所示: 我还有一个 createPopup 扩展(它确实在单击按钮时执行)。 public void createPopup(View view) {
我有一个用于显示谷歌地图的弹出窗口,但一旦它打开我似乎无法关闭它,我试图设置后退按钮以关闭它但无法调用 onBackButtonClick当我在 fragment 中时覆盖。虽然似乎没有做任何事情
我想像 Google Keep 在创建提醒时那样在虚拟键盘上方显示一个 PopupWindow: 最佳答案 我相信,您正在寻找的是以下组合: popupWindow.setSoftInputMode(
我如何显示和隐藏同一个弹出窗口,而不是每次都创建一个对象。这就是我创建窗口的方式。我不想解雇();并出于性能原因每次重新创建窗口。 popupWindow = new PopupWindow(
我是一名优秀的程序员,十分优秀!