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);
Ответы
Ответ 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
};