PopupWindow已经显示但我仍然可以滚动recyclerview

时间:2017-03-21 07:14:09

标签: android android-recyclerview popupwindow android-popupwindow

我想复制RecyclerView项目中的文本内容,所以我在TextView上设置了一个OnLongClickListener,同时它会显示一个包含复制按钮的PopupWindow。

我的问题是,当PopupWindow显示并滚动RecycleView时,我仍然触摸RecycleView,而RecycleView意外滚动。

我需要,如果PopupWindow已经显示,无论我是否还在接触RecyclerView,PopupWindow都应该拥有facus,除非PopupWindow被解雇,否则我不能做其他人。

enter image description here

我的init是一个PopupWindow代码:

mPopupWindow = new PopupWindow(context);
mPopupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
mPopupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
View contentView = LayoutInflater.from(context).inflate(R.layout.comment_popup_layout, null);
mPopupWindow.setContentView(contentView);
mPopupWindow.setOutsideTouchable(true);
mPopupWindow.setTouchable(true);
mPopupWindow.setFocusable(true);
mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

我使用方法showAsDropDown(View anchor, int xoff, int yoff)来显示窗口。

在我长时间离开谷歌之后需要一些帮助。

谢谢!

2 个答案:

答案 0 :(得分:1)

在适配器类的构造函数中传递RecyclerView的对象并初始化它 然后在构造函数

中添加它
if(mPopupWindow.isShowing()){
          recyclerView.setOnTouchListener(new View.OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
          return true;
      }
  });

}

答案 1 :(得分:0)

将取消事件发送到rootView以停止滚动。

//Record an ACTION_DOWN event which is just used to obtain an ACTION_CANCEL event.
var mDownEvent: MotionEvent? = null

//itemView is the root view of the Holder
itemView.setOnTouchListener { _, event -> 
    if(event.action == MotionEvent.ACTION_DOWN)
        mDownEvent = event
    if(event.action == MotionEvent.ACTION_UP || event.action == MotionEvent.ACTION_CANCEL)
        mDownEvent = null
}

显示PopupWindow之后

if(mDownEvent != null) {
    try {
        val cancelEvent = MotionEvent.obtain(mDownEvent)
        cancelEvent.action = MotionEvent.ACTION_CANCEL
        itemView.rootView.dispatchTouchEvent(cancelEvent)
    } catch (e: Exception) {
        //log the exception
    }
}