我正在做一个项目,要求我在屏幕上出现不同类型的触摸时写入日志。当我在一个打开的旋转器下方触摸时,它会关闭。我无法弄清楚如何检测这种触摸。
此代码无法捕获它,而它似乎捕获了小部件之外的所有其他触摸:
mFullView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
touchCounter++;
Log.d(TAG, "Touch #" + touchCounter + ", no button touch registered.");
}
return false;
}
});
其中mFullView是我拥有的父RelativeLayout并且设置如下:
mFullView = findViewById(R.id.full_view);
我也试过像这样使用onTouchEvent:
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getActionMasked();
if (action == MotionEvent.ACTION_DOWN) {
Log.d(TAG, "screen was touched outside of open spinner dropdown");
}
return super.onTouchEvent(event);
}
我在onCreate之外有这个代码,对放置或实现不太自信。
我无法找到有关如何实现此功能的任何信息,感谢您的帮助!
答案 0 :(得分:4)
点击后,Spinner
会显示Dialog
或PopupWindow
。这些都不会与您Window
的{{1}}相同,因此您无法从那里拦截触摸事件。
也许有人会破坏他的方式继承 Activity
我找到了一种方法来做到这一点,非常黑客。
1-我们需要覆盖Spinner
当public void onWindowFocusChanged(boolean hasFocus)
的{{1}}失去焦点时会调用此方法,因为Activity
的视图已被附加到在Window
的
PopupWindow
2-获取所有Window
根Activity
的列表,this answer有一个非常脏的hacky方法来执行此操作
这些根Window
中的一个将是View
,这是View
的私有非静态类。我们需要通过反射
PopupDecorView
的实例
4-一旦我们拥有PopupWindow
的实例,我们需要获取PopupWindow
,将其包裹在我们自己的一个并将其设置回PopupWindow
重写的方法如下所示:
OnTouchListener
其中getWindowManagerViews()来自上述答案,它看起来像这样
PopupWindow