活动

时间:2016-07-04 09:42:32

标签: android android-activity android-edittext overlay ontouchlistener

目前我在一个按钮上有一个OnTouchListener,它可以正常工作。代码如下:

    Button button1 =(Button) findViewById(R.id.btOk1);
    button1.setOnTouchListener(new OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            //do some stuff here
            return false;
        }
    });

我希望在我的整个Activity上都有一个OnTouchListener,这样每当用户点击我的Activity的任何区域时,我都会做一些事情。我的活动的根布局是一个TableLayout。我该怎么做?

谢谢!

编辑:

我设法通过命名我的根布局并设置onTouchListener来使用,如下所示:

    View view = findViewById(R.id.mylayout);
    view.setOnTouchListener(new OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            Log.d(TAG, "onTouch");
            if ((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_OBSCURED) != 0) {
                Log.d(TAG, "Obscured");
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    new AlertDialog.Builder(MyActivity.this)
                        .setTitle("Alert!")
                        .setMessage("Overlay detected!")
                        .setNeutralButton("Dismiss", null)
                        .show();
                }
                // Return true to prevent the button from processing the touch.
                return true;
            } else {
                Log.d(TAG, "Not obscured");
            }
            return false;
        }
    });

每当我点击布局上的任何地方时,我现在都会收到触摸事件。我还能够通过将MotionEvent标志与FLAG_WINDOW_IS_OBSCURED进行比较来检测将触摸事件传递给我的活动的叠加层,但前提是实际上隐藏了被触摸的区域。此外,onTouchListener似乎不会在触摸UI元素(如Buttons和EditText)时调用,但仅限于空白区域。

有没有办法检测我的Activity的任何部分是否被遮挡,是否有任何方法为整个Activity设置一个onTouchListener(),而不是为每个UI元素分别设置?

4 个答案:

答案 0 :(得分:2)

如果您只是想知道触摸事件发生,即没有触摸视图的信息,您可以覆盖Activity的dispatchTouchEvent。

答案 1 :(得分:1)

将OnTouchListener应用于您的激活的根布局。这将确定问题。

答案 2 :(得分:1)

this.setOnClickListener(this);

它可能不适用于活动,但它适用于扩展SurfaceView

的类

答案 3 :(得分:0)

创建宽度和高度为“fill_parent”的相对布局。 然后在activity中为Relative Layout创建一个onTouchListener。

RelativeLayout relativeLayout  =(RelativeLayout) findViewById(R.id.relativeLayout);
relativeLayout.setOnTouchListener(new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        //do some stuff here
        return false;
    }
});