2010-11-25 20 views
34

¿Hay una manera simple de deshabilitar a un usuario que interactúa con una actividad? Para hacer cuando hay una acción ejecutándose (y una barra de progreso girando en la barra de título)Deshabilitar toda una actividad de la acción del usuario

EDITAR: Como parece que no fui lo suficientemente claro, quise decir: mientras que ya tengo una barra de progreso giratoria, el usuario todavía puede presionar cualquier botón en la actividad, quiero inhabilitar al usuario para que pueda hacer eso mientras la tarea se está ejecutando. No obstante, no quiero desactivar cada elemento de la pantalla uno por uno.

Gracias, Jason

+0

¿Desea deshabilitar visiblemente todas las vistas, o simplemente desea que no respondan (= no es muy intuitivo para el usuario)? ¿O desea mostrar un ProgressDialog en la parte superior de su actividad? – EboMike

+0

Ok, podría haber estado un poco confuso, quise decir que ya tengo un diálogo de giro pero no quiero que el usuario presione más botones mientras está funcionando, (IE- desactiva todos los elementos de la actividad, pero no quiero hacer esto uno por uno) – Jason

Respuesta

101

Con el fin de bloquear los eventos táctiles del usuario, uso:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, 
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 

obtener los eventos táctiles atrás, use:

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 

EDIT: Si desea agregar una característica de desactivar y pantalla en gris, debe agregar en su archivo de diseño xml un diseño lineal que rellene el elemento principal. Establezca su fondo en # B0000000 y su visibilidad en Gone. Que programicamente establece su visibilidad en Visible.

+1

Si esto hace lo que parece, sufre el problema de que el usuario no verá la interfaz de usuario como "Desactivado" (en gris) – Jason

+1

Ok, tengo una solución para encadenar el pantalla. Lo publicaré más tarde –

+0

¿Alguien sabe qué es WindowManager? Pensé que podría importarlo, pero el eclipse no me lo propone, así que supongo que debería obtenerlo de otra manera ... – WhiskThimble

-2

SpinningProgress en la barra de título:

//onCreate(): 
activity.requestWindowFeature(FEATURE_INDETERMINATE_PROGRESS); 

//and then: 
activity.setProgressBarIndeterminate(boolean indeterminate) 

tanto en Activity class

Otra opción es utilizar el indicador de progreso (es posible que desee establecer como false cancelable en él).

0

que han resuelto este usando un método personalizado - que yo no quiero 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 que me gustaría saberlo! Gracias.

9

Si necesita deshabilitar el procesamiento de eventos por un período de tiempo (por ejemplo, mientras ejecuta una animación, muestra un diálogo de espera), puede anular las funciones de despacho de la actividad.

Para desactivar táctiles/clics en los botones, agregar a 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;   
} 

A continuación, sólo llamar enable(true/false) cuando se necesita para activar y desactivar el control de eventos normal de la actividad.

+0

con algunos ajustes para invertir el booleano, esto se puede expresar de manera más sucinta como 'return disabled || super.dispatchTouchEvent (ev); ' – gMale

+0

@gMale El valor de retorno del método se puede condensar, pero no es necesario invertir el booleano. Lo siguiente es el truco: '! Enabled || super.dispatchTouchEvent (ev) '. Android Studio lo sugerirá automáticamente. – Sid

0

Resolví esto agregando una imagen en blanco de pantalla completa con un controlador de clic nulo al final en el diseño XML.

Crea un archivo PNG transparente en la carpeta de los drawables.

Añadir un ImageView pantalla completa al final de la disposición XML 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" 
/> 

Añadir la nula clic lanzador de la imagen a capturar usuario toca:

public void doNothingClick(View v){ 
    // do nothing with the click 
} 

Agregue 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); 
} 
+0

No necesita usar una imagen y no tiene que implementar un método OnClick. – user2498768

Cuestiones relacionadas