我无法实现 OnTouchListener 来拖动弹出窗口
Posted
技术标签:
【中文标题】我无法实现 OnTouchListener 来拖动弹出窗口【英文标题】:I cannot implement OnTouchListener to drag a PopUp Window 【发布时间】:2018-10-13 11:16:53 【问题描述】:我想拖动我的 PopUpWindows。所以我尝试实现demo App从这里拖出一个简单的PopUp Window:
https://questdot.com/android-popup-floating-window-tutorial/
当我将监听器添加到视图时出现问题
popVideospeedView.setOnTouchListener(new View.OnTouchListener():
然后View.OnTouchListener()出现红色下划线并警告:
类“从 OnTouchListener 派生的匿名类”必须声明为抽象或在“OnTouchListener”中实现抽象方法“onTouch(View, MotionEvent)”
它还拒绝 @Override 说它不能被覆盖,还说它不能解决 MotionEvent
另外,库 android.view.View.OnTouchListener 来自:
import android.view.View.OnTouchListener;未使用
我的代码与引用的链接中运行的代码非常相似,他们的迷你应用程序在 Android Studio SDK 中编译并运行良好。但我的代码拒绝 触摸监听器的实现。我可能做错了什么?
我的弹出窗口实现的代码是:
public void functionVideospeedPopupWindow()
try
LayoutInflater popVideospeedLayoutInflater = (LayoutInflater) LMMoviesMainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View popVideospeedView = popVideospeedLayoutInflater.inflate(R.layout.popvideospeed, null);
final PopupWindow popVideospeedPopupWindow = new PopupWindow(popVideospeedView, LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT, true);
popVideospeedPopupWindow.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.colorStone)));
popVideospeedPopupWindow.setOutsideTouchable(false);
popVideospeedPopupWindow.setFocusable(false);
Button videospeedCloseButton = (Button) popVideospeedView.findViewById(R.id.popvideospeed_closeButton);
popVideospeedPopupWindow.showAtLocation(popVideospeedView, Gravity.CENTER, 0, 0); // 8:Margin to the left?. 18 comienza el texto utube
popVideospeedView.setOnTouchListener(new View.OnTouchListener()
@Override
public boolean onTouch(View v, MotionEvent event)
// event code...
return true;
);
videospeedCloseButton.setOnClickListener(new Button.OnClickListener()
public void onClick(View v)
popVideospeedPopupWindow.dismiss();
);
catch (Exception e)
// End of functionVideospeedPopupWindow()
我注意到与运行的示例的唯一区别是它们的 PopUp 代码是在 Class 的 onCreate 扇区中声明的,而我的 PopUp Window 代码位于由用户稍后在应用程序中。这是一个相关的区别吗?如果是,那么如何或为什么?
最后,如果我在 Class 的 implements 中添加:OnTouchListener(或者是 View.OnTouchListener?),如在: 公共课...等。 ... 实现 OnTouchListener,它用红色下划线并警告:
类“MyMainActivity”必须声明为抽象类或在“OnTouchListener”中实现抽象方法“onTouch(View, MotionEvent)”
我知道要实现 OnTouchListener 接口,我应该添加如下结构:
public boolean onTouch(View v, MotionEvent 事件) ...
但是如何处理在 PopUp 方法之外声明的 onTouch 的弹出窗口? 非常感谢您的任何想法和兴趣。
【问题讨论】:
您在帖子中提供了很多详细信息(这很好!),但对我来说仍然存在一个问题:您尝试使用链接项目中的代码,但您说您已经采取在某些地方采取不同的方法。那么您能否发布足够的代码让我们准确重现您的问题? 嗨。谢谢你的关注。我不知道还有什么相关的。我需要解决的是如何在方法内声明的弹出窗口上启用拖动。只需为其视图实现 OnTouchListener 应该是可行的,但它不起作用,我无法理解为什么。 所以我可以使用一个几乎为空的 Activity,然后单击某个 Button 并触发此方法functionVideospeedPopupWindow()
不起作用?
是的,从字面上看,在一个通用类中。这个方法在一个runnable中执行: private Runnable popupVideospeedHandlerCodeRunnable = new Runnable() @Override public void run() functionVideospeedPopupWindow(); ;并且runnable运行在:Handler popupVideospeedHandler = new Handler(); popupVideospeedHandler.postDelayed(popupVideospeedHandlerCodeRunnable, PopUpMsecsDELAY);并且弹出窗口可以正常打开(当然,没有 OnTouchListener 部分)。但我看不出这有什么关系……
解决了!事实证明,当我尝试使用 Alt+Enter 时,Android Studio 没有为 MotionEvent 添加库。所以我手动添加了库:import android.view.MotionEvent;现在 View.OnTouchListener 不会产生任何警告。非常感谢您的帮助,我希望这个案例可以帮助其他人克服这个愚蠢的错误。干杯。
【参考方案1】:
已解决!当我尝试使用 Alt+Enter
时,Android Studio 并没有为 MotionEvent 添加库。所以我手动添加了 library: import android.view.MotionEvent;
现在 View.OnTouchListener
不会产生任何警告。非常感谢您的帮助,我希望这个案例可以帮助其他人克服这个愚蠢的错误。干杯
【讨论】:
以上是关于我无法实现 OnTouchListener 来拖动弹出窗口的主要内容,如果未能解决你的问题,请参考以下文章
如果我在 OnTouchListener 中返回 false,实际会发生啥?