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

Android: Как предотвратить передачу каких-либо событий касания от представления к тому, что находится под ним?

В частности, используя приведенный ниже код, есть ли способ его изменить, чтобы активность в этом новом созданном представлении не получала никаких жестов?

View v1 = new View(this);    
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
 1000,
 50,
 WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
 WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
 PixelFormat.OPAQUE);

params.gravity = Gravity.BOTTOM;
WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
wm.addView(v1, params);
4b9b3361

Ответ 1

Добавьте метод onTouchEvent к представлению с верхней позицией и верните true. True сообщит, что событие пузырится, что событие было израсходовано, поэтому предотвращает появление пузырьков в других представлениях.

protected boolean onTouchEvent (MotionEvent me) {
    return true;
}

Для v1 вы сделаете импорт:

import android.view.View.OnTouchListener;

Затем установите onTouchListener:

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

Ответ 2

Из кода

View v1 = new View(this);   
v1.setClickable(true);
v1.setFocusable(true);

ИЛИ

От xml

<View
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="My button"
    android:focusable="true"
    android:clickable="true"/>

Это предотвратит распространение событий касания и кликов до просмотров, которые остаются ниже вашего представления.
Или если вы надуваете представление, а затем на .xml добавьте android:clickable="true"

Ответ 3

Вы тоже можете это сделать. Вы можете настроить сенсорный прослушиватель на дочерний, а затем в onTouch() событие, вы можете заблокировать intercept touch event родителя.

то есть.

View v = findViewById(R.id.sample_view);
v.setOnTouchListener(new OnTouchListener() {
    // Setting on Touch Listener for handling the touch inside ScrollView
    @Override
    public boolean onTouch(View v, MotionEvent event) {
    // Disallow the touch request for parent scroll on touch of child view
    v.getParent().requestDisallowInterceptTouchEvent(true);
    return false;
    }
});

Ответ 4

Вы добавляете представление, как показано ниже, но убедитесь, что это последнее представление, добавленное в ваш XML. Последний элемент в xml - это элемент, который лежит поверх всех других представлений под ним.

<View
        android:id="@+id/blocking_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#AA666666"
        android:clickable="true"
        android:focusable="true"
        android:visibility="visible"/>

Ответ 5

все, что вам нужно сделать, это просто позвонить

arg0.getParent().requestDisallowInterceptTouchEvent(true);

в начале вашей функции onTouch. Как это -

    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
        arg0.getParent().requestDisallowInterceptTouchEvent(true);
        switch(arg1.getActio){
        }

        return false; 

     }

Ответ 6

Я немного опаздываю на вечеринку, но я не думаю, что принятое решение очень велико. Вот статический метод, который принимает любое количество просмотров и отключает это событие. Это работало для меня в 100% случаев для API 17+ (ниже непроверено)

public static void disableEventBubbling(View... views){
    for(View view : views){
        if(view != null){
            view.setOnTouchListener(new View.OnTouchListener(){
               @Override
                public boolean onTouch(View view, MotionEvent event){
                    view.getParent().requestDisallowInterceptTouchEvent(true);
                    return false;
                }
            });
        }
    }
}

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

Ответ 7

Просто добавьте делегат щелчка к фону вида сверху, который остановит представления под полученными прикосновениями

linear_layout_sending_background.Click += delegate
            {
                // Ensures views underneath does not receive touch events
            };