2017-11-13 14 views
0

그래서 기본 콜백 코드와 콜백 커스터마이징을 제외하고는 기본적으로 아무것도 수행하지 않는 커스텀 클래스를 만들었습니다. 어떤 이유로 든 하단 시트의 테두리 바깥을 만지면 취소 할 수 없습니다.맞춤 BottomSheetDialog 클래스를 사용하면 취소 할 수 없습니다 .Outsideside to

public class CustomBottomSheetDialog extends AppCompatDialog { 

public CustomBottomSheetDialog(Context context) { 
    super(context, R.style.Theme_Design_Light_BottomSheetDialog); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 
} 

@Override 
public void setContentView(View view) { 
    final CoordinatorLayout coordinator = (CoordinatorLayout) View.inflate(getContext(), 
      R.layout.design_bottom_sheet_dialog, null); 
    FrameLayout bottomSheet = (FrameLayout) coordinator.findViewById(R.id.design_bottom_sheet); 
    BottomSheetBehavior.from(bottomSheet).setBottomSheetCallback(mBottomSheetCallback); 
    bottomSheet.addView(view); 
    super.setContentView(coordinator); 
} 

private BottomSheetBehavior.BottomSheetCallback mBottomSheetCallback = new BottomSheetBehavior.BottomSheetCallback() { 
    @Override 
    public void onStateChanged(View bottomSheet, int newState) { 
     if (newState == BottomSheetBehavior.STATE_HIDDEN) { 
      cancel(); // The only not boilerplate code here, woo 
     } 
    } 

    @Override 
    public void onSlide(View bottomSheet, float slideOffset) { } 
}; 

것들 나는 시도했다 :

bottomSheetDialog.setCancelable (TRUE);
bottomSheetDialog.setCanceledOnTouchOutside (true);
dispatchTouchEvent를 (를) 재정의하지만 전체 화면 크기 이외의 다른 항목과 동일한 사각형을 가져올 수 없습니다.
사용자 정의 클래스를 사용하지 않으면 (예 : BottomSheetDialog에 대한 CustomBottomSheetDialog 호출 만 변경하면), 터치시 취소가 발생하지만 드래그하여 대화 상자를 숨길 때 취소되지 않습니다. 가지고 있어야합니다.

답변

0

마지막으로 가져 왔습니다. onCreate에서 한 줄의 코드를 추가하여 touch_outside보기를 찾고 클릭 리스너를 추가하여 대화 상자를 취소했습니다. touch_outside보기는 기본적으로 생성됩니다. 하단 시트의 XML에 추가 할 필요가 없습니다.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    findViewById(R.id.touch_outside).setOnClickListener(v -> cancel()); // <--- this guy 
    getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 
} 

감사합니다. this tutorial으로갑니다.