30

アプリ画面のどこかでクリックが発生したときにイベントをキャッチするにはどうすればよいですか?ボタンか何か他のものがあるかどうかは関係ありません。onClick()アプリケーション画面全体にイベントリスナー を適用するだけです。
これを行う方法?

4

7 に答える 7

29

setonclicklistnerレイアウトファイルのメインレイアウト用...

Like .... 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>

メインレイアウトのクリックリスナーを設定します。

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

    @Override
    public void onClick(View v) {

    }

 });
于 2012-04-12T15:03:43.687 に答える
9

最も簡単な方法は、あなたのonUserInteractionをオーバーライドすることだと思いますActivity

ユーザーがオン/オフEditTextおよびSpinners(おそらく他のウィジェットも)フォーカスした場合は起動しないことに注意してください。ただし、ユーザーが画面に触れるか、ボタンを押すたびに起動します。

ただし、これにより、リスナーをレイアウトに組み込んだり、それらのリスナーを処理するための追加のメソッドを記述したりする必要がなくなるため、必要なものを取得するための最も問題のない方法だと思います。

于 2017-10-10T03:05:03.323 に答える
8

ActivitydispatchTouchEvent(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

たぶん、あなたはレイアウトインスタンスにリスナーを追加して、レイアウトを取得することができます

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