У меня есть модал BottomSheetDialog
. Текущее и стандартное поведение диалога: когда я перетаскиваю диалоговое окно вниз, оно закрывается. Например, предположим, что значение диалога составляет от 0,0 (свернуто) до 1,0 (развернуто). Поэтому, когда пользователь перетаскивает его до 0,5, он падает. Но поведение, которое я хочу, это закрывать диалог, когда я перетаскиваю диалог до 0,8 и убираю палец. Как я могу добиться такого поведения, есть ли способ ???
Кроме того, я думаю, что было бы здорово разрешить закрытие диалога только при перетаскивании его с помощью любой кнопки перетаскивания (в большинстве случаев это просто ImageView
).
Итак, я хочу закрыть диалоговое окно, когда пользователь немного перемещает диалоговое окно (перетаскивает).
Итак, мой текущий код:
public class FiltersBottomSheet extends BottomSheetDialogFragment {
private FragmentFilterBinding binding;
public FiltersBottomSheet() {}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_filter, container, false);
View view = binding.getRoot();
// I'm using data binding
// There is a little logic, but now you don't need it :)
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.getViewTreeObserver()
.addOnGlobalLayoutListener(() -> {
BottomSheetDialog dialog = (BottomSheetDialog) getDialog();
LinearLayout bottomSheet = dialog.findViewById(R.id.bottom_frame);
if (bottomSheet != null) {
BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
behavior.addBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
//Log.d("Tag___1", "NewState: " + newState);
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
//Log.d("Tag___1", "Offset: " + slideOffset);
}
});
}
});
}
}
Итак, прежде всего я подумал, что onSlide()
может мне помочь, но ... Этот метод вызывается только тогда, когда пользователь разворачивает или сворачивает диалоговое окно. Например, когда пользователь касается диалогового окна и начинает его перетаскивать, метод onSlide () не вызывается. Также вы видите выше, я позвонил view.getViewTreeObserver()
, я пытался добавить onTouchListener
к этому представлению. И проблема здесь в том, что MotionEvenet.ACTION_UP
не вызывает, когда пользователь убирает палец после перемещения диалога. Так есть идеи? Спасибо.