Pregunta Deshabilita los eventos táctiles para todas las vistas


¿Cuál es la mejor manera de desactivar los eventos táctiles para todas las vistas?

Muchas gracias,

Gratzi


35
2018-03-24 11:38


origen


Respuestas:


Aquí hay una función para deshabilitar todas las vistas secundarias de un grupo de vista:

 /**
   * Enables/Disables all child views in a view group.
   * 
   * @param viewGroup the view group
   * @param enabled <code>true</code> to enable, <code>false</code> to disable
   * the views.
   */
  public static void enableDisableViewGroup(ViewGroup viewGroup, boolean enabled) {
    int childCount = viewGroup.getChildCount();
    for (int i = 0; i < childCount; i++) {
      View view = viewGroup.getChildAt(i);
      view.setEnabled(enabled);
      if (view instanceof ViewGroup) {
        enableDisableViewGroup((ViewGroup) view, enabled);
      }
    }
  }

52
2018-01-13 11:12



Anular el dispatchTouchEvent método de la actividad y así:

@Override
public boolean dispatchTouchEvent(MotionEvent ev){      
  return true;//consume
}

Si regresas true todos los eventos táctiles están deshabilitados.

Regreso false para dejarlos trabajar normalmente


15
2018-02-10 10:27



Tu podrías intentar:

your_view.setEnabled(false);

Lo cual debería deshabilitar los eventos táctiles.

alternativamente puedes probar (gracias a Ercan):

@Override
public boolean dispatchTouchEvent(MotionEvent ev){      
  return true;//consume
}

o

public boolean dispatchTouchEvent(MotionEvent ev) {
    if(!onInterceptTouchEvent()){
        for(View child : children){
            if(child.dispatchTouchEvent(ev))
                return true;
        }
    }
    return super.dispatchTouchEvent(ev);
}

13
2017-12-13 13:12



Este fragmento de código básicamente propagará este evento a la vista principal, permitiendo el evento táctil, si y solo si el inProgress la variable está configurada para false.

private boolean inProgress = false;

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (!inProgress)
        return super.dispatchTouchEvent(ev);
    return true;
 }

8
2017-09-15 09:09



¿Qué tal si cubrimos una vista transparente de todas sus vistas y capturamos todos los eventos táctiles?


3
2017-08-01 07:19



Utilizar esta. Al regresar verdadero, indicará que el oyente ha consumido el evento y Android no necesita hacer nada.

view.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return true;
    }
});

3
2018-04-21 15:02



Es posible que no sea posible para toda la aplicación. Deberá sobrescribir OnTouchEvent () para cada vista e ignorar las entradas del usuario.


2
2018-03-24 11:50



Hice este método, que funciona perfecto para mí. Deshabilita todos los eventos táctiles para la vista seleccionada.

public static void disableView(View v) {

    v.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return true;
        }
    });

    if (v instanceof ViewGroup) {
        ViewGroup vg = (ViewGroup) v;
        for (int i = 0; i < vg.getChildCount(); i++) {
            View child = vg.getChildAt(i);
            disableView(child);
        }
    }
}

1
2017-09-11 08:07



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

1
2018-02-25 22:33