我无法实现 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 来拖动弹出窗口的主要内容,如果未能解决你的问题,请参考以下文章

Android:通过拖动图像的特定部分来旋转图像

整个屏幕的 OnTouchListener

Android LinearLayout 多点触控

如果我在 OnTouchListener 中返回 false,实际会发生啥?

为啥即使在自定义 OnTouchListener 实现后 RecyclerView 仍然滚动?

操作栏 - 拖动菜单项