30

当应用程序屏幕上某处发生点击时,如何捕捉事件?是否有按钮或其他东西都没有关系。我只需要onClick()在整个应用程序屏幕上应用一个事件监听器。
这个怎么做?

4

7 回答 7

29

setonclicklistner用于布局文件的主要布局......

像....main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/mainlayout">
 <!- Your other view->
</Relativelayout>

并为 mainlayout 设置单击侦听器...

 RelativeLayout rlayout = (RelativeLayout) findViewById(R.id.mainlayout);
 rlayout.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {

    }

 });
于 2012-04-12T15:03:43.687 回答
9

我相信最简单的方法是你的Activity

EditText请注意,当用户关注 on/off和Spinners(可能还有其他小部件)时,它不会触发。但是每次用户触摸屏幕或按下按钮时它都会触发。

但这使得无需在布局中构建侦听器或编写额外的方法来处理这些侦听器,因此我相信这是获得所需内容的最轻松的方式。

于 2017-10-10T03:05:03.323 回答
8

你应该重写Activity'sdispatchTouchEvent(ev: MotionEvent)方法


看一下 Kotlin 中的这个例子。这种方法不会影响您应用中的任何 onClickListenters

/**
 * On each touch event:
 * Check is [snackbar] present and displayed
 * and dismiss it if user touched anywhere outside it's bounds
 */
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
    // dismiss shown snackbar if user tapped anywhere outside snackbar
    snackbar?.takeIf { it.isShown }?.run {
        val touchPoint = Point(Math.round(ev.rawX), Math.round(ev.rawY))
        if (!isPointInsideViewBounds(view, touchPoint)) {
            dismiss()
            snackbar = null // set snackbar to null to prevent this block being executed twice
        }
    }

    // call super
    return super.dispatchTouchEvent(ev)
}

或查看完整的要点

于 2018-11-10T23:01:43.403 回答
5

如果您想知道用户点击了屏幕上的任何位置,那么诀窍就是覆盖 OnUserUnteraction():

“每当按键、触摸或轨迹球事件被调度到活动时调用。如果您希望知道用户在活动运行时以某种方式与设备交互,请实现此方法。此回调和 {@link #onUserLeaveHint } 旨在帮助活动智能地管理状态栏通知;特别是,帮助活动确定取消通知的适当时间...."

public abstract class BaseActivity extends Activity {
...
@Override
public void onUserInteraction() {
    Log.d(DEBUG_TAG,"Touch anywhere happened");
    super.onUserInteraction();
}

在一些不活动后,我正在使用它来设置应用程序屏幕块。

于 2020-04-13T12:00:01.380 回答
1

给你的主布局一个id,然后

LinearLayout root = (LinearLayout) findViewById(R.id.main_layout);
root.setOnClickListener(new OnClickListener() {
    public void onClick()
    {

    }
});
于 2012-04-12T15:04:44.770 回答
1

您也可以直接从onClick根布局的 xml 属性设置回调:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:onClick"myMethod">
 <!- Your other view->
</Relativelayout>

在您的活动中:

public void myMethod(View pView) {
  //XXX do something
}

这样可以减少臃肿的代码:)

于 2017-02-20T08:49:59.100 回答
0

也许您可以向 Layout 实例添加一个侦听器,获取布局

RelativeLayout l = (RelativeLayout)findViewById(R.id.mylayout);
l.setOnClickListener(click);
于 2012-04-12T15:04:55.833 回答