如何在Android中的开放式微调器之外聆听?

时间:2017-06-27 16:18:43

标签: android spinner ontouchlistener ontouchevent

我正在做一个项目,要求我在屏幕上出现不同类型的触摸时写入日志。当我在一个打开的旋转器下方触摸时,它会关闭。我无法弄清楚如何检测这种触摸。

此代码无法捕获它,而它似乎捕获了小部件之外的所有其他触摸:

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之外有这个代码,对放置或实现不太自信。

我无法找到有关如何实现此功能的任何信息,感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

点击后,Spinner会显示DialogPopupWindow。这些都不会与您Window的{​​{1}}相同,因此您无法从那里拦截触摸事件。

也许有人会破坏他的方式继承Activity

我找到了一种方法来做到这一点,非常黑客。

1-我们需要覆盖Spinnerpublic void onWindowFocusChanged(boolean hasFocus)的{​​{1}}失去焦点时会调用此方法,因为Activity的视图已被附加到在Window

之上添加新的PopupWindow

2-获取所有WindowActivity的列表,this answer有一个非常脏的hacky方法来执行此操作

这些根Window中的一个将是View,这是View的私有非静态类。我们需要通过反射

获取PopupDecorView的实例

4-一旦我们拥有PopupWindow的实例,我们需要获取PopupWindow,将其包裹在我们自己的一个并将其设置回PopupWindow

重写的方法如下所示:

OnTouchListener

其中getWindowManagerViews()来自上述答案,它看起来像这样

PopupWindow