Как изменить поведение диалога нижнего листа - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть модал 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 не вызывает, когда пользователь убирает палец после перемещения диалога. Так есть идеи? Спасибо.

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

Если вы хотите изменить поведение диалогового окна нижнего листа в нижнем фрагменте диалогового окна, используйте это:

@Override
    public void onViewCreated(NotNull@ View view, Nullable@ Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState)
      view.getViewTreeObserver()
                .addOnGlobalLayoutListener(() -> {
        BottomSheetDialog dialog =(BottomSheetDialog) getDialog ()
      if (dialog != null) {
            FrameLayout bottomSheet = dialog.findViewById (R.id.design_bottom_sheet)
          if (bottomSheet != null) {
                BottomSheetBehavior behavior = BottomSheetBehavior.from (bottomSheet)
              behavior.setState(BottomSheetBehavior.STATE_EXPANDED)
              behavior.setSkipCollapsed(true)
              behavior.setHideable(false)
            }
        }
      })
    }

Это поможет вам установить расширенное и скрываемое ложное значение, а также вы можете добавить настраиваемый размер для расширения. .

0 голосов
/ 05 апреля 2020

Я думаю, вы можете настроить атрибут behavior_halfExpandedRatio, а также настроить обратные вызовы при скольжении:

val bottomSheetCallback = object : BottomSheetBehavior.BottomSheetCallback() {

    override fun onStateChanged(bottomSheet: View, newState: Int) {
        // Do something for new state
    }

    override fun onSlide(bottomSheet: View, slideOffset: Float) {
        // Do something for slide offset
    }
}
bottomSheetBehavior.addBottomSheetCallback(bottomSheetCallback)
...