Подтвердить что ты не робот

Отключить сенсорные события для всех видов

Каким образом можно отключить сенсорные события для всех просмотров?

Большое спасибо,

Gratzi

4b9b3361

Ответ 1

Вот функция отключения всех дочерних представлений для некоторой группы просмотров:

 /**
   * 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);
      }
    }
  }

Ответ 2

Переопределите метод dispatchTouchEvent активности и вот так:

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

Если вы вернетесь true, все события касания будут отключены.

Верните false, чтобы они нормально работали

Ответ 3

Вы можете попробовать:

your_view.setEnabled(false);

Который должен отключить сенсорные события.

В качестве альтернативы вы можете попробовать (спасибо Ercan):

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

или же

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

Ответ 4

Этот фрагмент кода будет в основном распространять это событие в родительском представлении, позволяя событие касания, если и только если переменная inProgress установлена ​​на false.

private boolean inProgress = false;

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

Ответ 5

Используйте это. return true указывает, что слушатель потребляет событие, и андроиду ничего не нужно делать.

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

Ответ 6

Как покрыть прозрачный вид на все ваши взгляды и захватить все события касания?

Ответ 7

Это может быть невозможно для всего приложения. Вам необходимо переопределить onTouchEvent() для каждого представления и игнорировать пользовательские входы.

Ответ 8

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

Ответ 9

Я сделал этот метод, который отлично подходит для меня. Он отключает все события касания для выбранного вида.

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);
        }
    }
}

Ответ 10

За ваш комментарий:

Я просто хочу, чтобы в какой-то момент можно было отключить представления текущей активности

вам кажется, что вы хотите отключить все касание для текущей активности, независимо от того, какое изображение коснулось.

Возврат true из переопределения Activity.dispatchTouchEvent(MotionEvent) в соответствующие моменты времени будет потреблять прикосновение и эффективно выполнить это. Этот метод является первым в цепочке вызовов сенсорного метода.

Ответ 11

Еще один более простой способ - отключить его через файл макета (например .xml): Просто добавьте

 android:shouldDisableView="True"

для просмотра, которое вы хотите отключить события касания.

Ответ 12

В Котлине:

fun View.setEnabledRecursively(enabled: Boolean) {
    isEnabled = enabled
    if (this is ViewGroup)
        (0 until childCount).map(::getChildAt).forEach { it.setEnabledRecursively(enabled) }
}

// usage
import setEnabledRecursively

myView.setEnabledRecursively(false)

Ответ 13

Самый простой способ сделать это -

private fun enableDisableActivty(isEnable : Boolean){
    if(!isEnable) window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
    else window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)

}