subir - pantalla dividida android 8
¿Cómo desencadenar un evento cuando alguien hace clic en cualquier lugar de la pantalla en una aplicación de Android? (6)
¿Cómo puedo detectar el evento cuando se produce un clic en algún lugar de la pantalla de la aplicación? No importa si hay un botón o algo más. Solo necesito aplicar un detector de eventos onClick()
en toda la pantalla de la aplicación.
¿Como hacer esto?
Creo que la forma más fácil es anular onUserInteraction en su Activity
EditText
cuenta que no se activará cuando los usuarios se centren en EditText
/ EditText
y Spinners
(probablemente también otros Widgets). Pero se activará cada vez que el usuario toque la pantalla o presione un botón.
Pero esto hace que no sea necesario incorporar oyentes en sus diseños o escribir métodos adicionales para manejarlos, por lo que creo que es la forma más sencilla de obtener lo que desea.
Dale a tu diseño principal una identificación, entonces
LinearLayout root = (LinearLayout) findViewById(R.id.main_layout);
root.setOnClickListener(new OnClickListener() {
public void onClick()
{
}
});
Quizás pueda agregar un escucha a la instancia de Diseño, obteniendo el diseño con
RelativeLayout l = (RelativeLayout)findViewById(R.id.mylayout);
l.setOnClickListener(click);
Solo debe anular el método dispatchTouchEvent(ev: MotionEvent)
Mira este ejemplo en Kotlin. Este enfoque no afectará a ningún onClickListenters en su aplicación
/**
* 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)
}
O echa un vistazo a la gist completa
También puede establecer directamente una devolución de llamada desde el atributo onClick
xml del diseño raíz:
<?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>
Y en tu actividad:
public void myMethod(View pView) {
//XXX do something
}
Menos código hinchado de esta manera :)
setonclicklistner
para el diseño principal de su archivo de diseño ...
Me gusta .... 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>
y establece click listener para mainlayout ...
RelativeLayout rlayout = (RelativeLayout) findViewById(R.id.mainlayout);
rlayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});