sobre - manual de programacion android
Deshabilitar toda una actividad de la acción del usuario. (6)
Para bloquear eventos táctiles de usuario, use:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
Para recuperar los eventos táctiles, usa:
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
EDITAR: Si desea agregar una función de visualización deshabilitada y en gris, debe agregar en su archivo de diseño XML un diseño lineal que llene el elemento primario. Establezca su fondo en # B0000000 y su visibilidad en Gone. Que programáticamente establezca su visibilidad a Visible.
¿Existe una forma sencilla de deshabilitar a un usuario que interactúa con una actividad? Debe hacerse cuando hay una acción en ejecución (y una barra de progreso giratoria en la barra de título)
EDITAR: Como parece que no estaba lo suficientemente claro, quise decir: aunque ya tengo una barra de progreso giratoria, el usuario todavía puede presionar cualquier botón en la actividad, quiero impedir que el usuario pueda hacerlo mientras. la tarea se está ejecutando. No quiero, sin embargo, deshabilitar cada elemento en la pantalla uno por uno.
Gracias jason
Resolví esto agregando una imagen en blanco a pantalla completa con un controlador de clic nulo al final del diseño XML.
Crea un archivo PNG transparente en la carpeta de objetos dibujables.
Agregue un ImageView a pantalla completa al final del diseño XML que hace referencia a la imagen:
...
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:srcCompat="@drawable/img_mask"
android:id="@+id/imgMask"
android:scaleType="fitXY"
android:visibility="gone"
android:onClick="doNothingClick"
/>
Agregue el controlador de clic nulo a la imagen para capturar los toques del usuario:
public void doNothingClick(View v){
// do nothing with the click
}
Agrega el código para deshabilitar los toques del usuario:
private void StopTouches(int duration){
findViewById(R.id.imgMask).setVisibility(View.VISIBLE);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
findViewById(R.id.imgMask).setVisibility(View.GONE);
}
}, duration);
}
Resolví esto usando un método personalizado, que no quería hacer:
public static void setViewGroupEnabled(ViewGroup view, boolean enabled)
{
int childern = view.getChildCount();
for (int i = 0; i< childern ; i++)
{
View child = view.getChildAt(i);
if (child instanceof ViewGroup)
{
setViewGroupEnabled((ViewGroup) child, enabled);
}
child.setEnabled(enabled);
}
view.setEnabled(enabled);
}
Si alguien encuentra una manera mejor, me gustaría saberlo! Gracias.
Si necesita desactivar el procesamiento de eventos durante un período de tiempo (por ejemplo, mientras ejecuta una animación, muestre un cuadro de diálogo de espera), puede anular las funciones de envío de la actividad.
Para deshabilitar el toque / clics en cualquier botón, agregue estos miembros / funciones a su actividad:
protected boolean enabled = true;
public void enable(boolean b) {
enabled = b;
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return enabled ?
super.dispatchTouchEvent(ev) :
true;
}
Luego simplemente llame a enable(true/false)
cuando necesite deshabilitar y habilitar el manejo normal de eventos de la actividad.
SpinningProgress en la barra de título:
//onCreate():
activity.requestWindowFeature(FEATURE_INDETERMINATE_PROGRESS);
//and then:
activity.setProgressBarIndeterminate(boolean indeterminate)
ambos en clase de actividad
Otra opción es usar el diálogo de progreso (es posible que desee establecer la cancelación en falso).
Utilice AsyncTask con ProgressDialog incluido.
otro ejemplo útil: