アプリ画面のどこかでクリックが発生したときにイベントをキャッチするにはどうすればよいですか?ボタンか何か他のものがあるかどうかは関係ありません。onClick()
アプリケーション画面全体にイベントリスナー
を適用するだけです。
これを行う方法?
7 に答える
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) {
}
});
最も簡単な方法は、あなたのonUserInteractionをオーバーライドすることだと思いますActivity
ユーザーがオン/オフEditText
およびSpinners
(おそらく他のウィジェットも)フォーカスした場合は起動しないことに注意してください。ただし、ユーザーが画面に触れるか、ボタンを押すたびに起動します。
ただし、これにより、リスナーをレイアウトに組み込んだり、それらのリスナーを処理するための追加のメソッドを記述したりする必要がなくなるため、必要なものを取得するための最も問題のない方法だと思います。
Activity
のdispatchTouchEvent(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)
}
または完全な要点をチェックしてください
ユーザーが画面上の任意の場所をクリックしたことを知りたい場合は、OnUserUnteraction()をオーバーライドするのがコツです。
「キー、タッチ、またはトラックボールのイベントがアクティビティにディスパッチされるたびに呼び出されます。アクティビティの実行中にユーザーが何らかの方法でデバイスを操作したことを知りたい場合は、このメソッドを実装してください。このコールバックと{@link #onUserLeaveHint }は、アクティビティがステータスバーの通知をインテリジェントに管理できるようにすることを目的としています。具体的には、アクティビティが通知をキャンセルする適切な時間を決定するのに役立ちます。...」
public abstract class BaseActivity extends Activity {
...
@Override
public void onUserInteraction() {
Log.d(DEBUG_TAG,"Touch anywhere happened");
super.onUserInteraction();
}
非アクティブになった後、アプリの画面ブロックを設定するために使用しています。
メインレイアウトにIDを付けてから、
LinearLayout root = (LinearLayout) findViewById(R.id.main_layout);
root.setOnClickListener(new OnClickListener() {
public void onClick()
{
}
});
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
}
この方法で肥大化の少ないコード:)
たぶん、あなたはレイアウトインスタンスにリスナーを追加して、レイアウトを取得することができます
RelativeLayout l = (RelativeLayout)findViewById(R.id.mylayout);
l.setOnClickListener(click);