【问题标题】:OnTouchListener on Activity活动上的 OnTouchListener
【发布时间】:2016-11-05 23:55:24
【问题描述】:

目前我在按钮上有一个 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 进行比较,我还能够检测到将触摸事件传递给我的 Activity 的覆盖,但前提是被触摸的区域实际上被遮挡了。此外,onTouchListener 似乎不会在触摸 UI 元素(如 Button 和 EditText)时被调用,而只会在空白处调用。

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢。这行得通,但我必须在根布局中添加一个 id。另一个问题 - 有没有办法找出 Activity 是否被任何其他 UI 元素遮挡,例如Toast 通知或系统警报?我尝试使用 MotionEvent.FLAG_WINDOW_IS_OBSCURED 测试 event.getFlags(),但这似乎只适用于屏幕被遮挡的区域,而不适用于其他未被遮挡的区域。
      • 我已经修改了原帖。
      【解决方案3】:
      this.setOnClickListener(this);
      

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

      【讨论】:

        【解决方案4】:

        创建一个宽度和高度为“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;
            }
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-11-20
          • 2016-11-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多