IT TIP

Android : 터치 이벤트가 뷰에서 그 아래에있는 뷰로 전달되는 것을 방지하는 방법은 무엇입니까?

itqueen 2020. 12. 26. 16:21
반응형

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

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

코드에서

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"


당신도 할 수 있습니다. 터치 리스너를 자식보기로 설정하고 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;
    }
});

아래와 같이보기를 추가하지만 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"/>

전화 만하면됩니다.

arg0.getParent().requestDisallowInterceptTouchEvent(true);

onTouch 기능을 시작할 때. thsi처럼-

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

        return false; 

     }

나는 파티에 조금 늦었지만 수용된 해결책이별로 훌륭하다고 생각하지 않습니다. 다음은 원하는 수의 뷰를 허용하고이 이벤트 버블 링을 비활성화하는 정적 메서드입니다. 이것은 API 17+ (테스트되지 않은 더 낮음)에 대해 100 % 효과가 있습니다.

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

원하는 모든 종류의 이벤트에 대한 케이스를 추가하거나 스위치를 제거하고 기본 케이스를 터치 리스너 내부의 유일한 행으로 만들 수 있습니다.


클릭 델리게이트를 상위 뷰 배경에 추가하기 만하면 터치 수신 아래의 뷰가 중지됩니다.

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

ReferenceURL : https://stackoverflow.com/questions/8433387/android-how-to-prevent-any-touch-events-from-being-passed-from-a-view-to-the-on

반응형