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
'IT TIP' 카테고리의 다른 글
목록이 Java로 정렬되었는지 확인하는 방법은 무엇입니까? (0) | 2020.12.26 |
---|---|
Heroku에서 Postgres DB 삭제 (0) | 2020.12.26 |
AngularJS ngRepeat 요소 제거 (0) | 2020.12.26 |
무엇입니까? : Kotlin에서 수행합니까? (0) | 2020.12.26 |
주어진 횟수만큼 다른 문자열을 반복하여 NSString 만들기 (0) | 2020.12.26 |