BottomSheetDialog get Behavour всегда возвращает значение NULL - PullRequest
0 голосов
/ 18 ноября 2018

Я работаю с BottomSheetDialog , и мне нужно получить поведение, поэтому можно установить setBottomSheetCallback () для обработки некоторых вещей.

Как говорит Google, мне пришлось поместить Coordinator в parentView и добавить к нему поведение. Я определил CoordinatorLayout в MainActivity (корневая активность) следующим образом:

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:tag="coordinatorLayout"
    app:layout_behavior="android.support.design.widget.BottomSheetBehavior"

...

Это попытка получить от активности:

 public void setupDialog(final Dialog dialog, int style) {

 CoordinatorLayout coordinatorLayout = getActivity().getWindow().getDecorView();
 BottomSheetBehavior behavior = BottomSheetBehavior.from(coordinatorLayout);

Я тоже пробовал:

CoordinatorLayout coordinatorLayout = getActivity().getWindow().getDecorView().findViewById(R.id.coordinatorLayout); 
//this is point to the coordinatorView 

BottomSheetBehavior behavior = BottomSheetBehavior.from(coordinatorLayout);
//But this returns same error that "The view is not a child of CoordinatorLayout"

Как вы видите, я передал координатор-макет, но метод не может найти в нем поведение. Я также должен упомянуть некоторые моменты использования BottonSheetDialog :

  1. Я показываю свои фрагменты BottonSheetFrage так:
  2. Я накачал свой BottomSheetDialog в OnCreateView (не в setupDialog ()) для возможности добавления View Pager внутри. Как вы, возможно, знаете, ViewPager не будет подключаться к BottonSheetDialog, если вы будете раздувать представление в onSetupDialog () .

В любом случае я не смог получить поведение CoordinatorLayout родителя. В моем bottonSheetDialog я пробую эти методы, и ни один из них не работает, и я получаю «Представление не является дочерним по отношению к CoordinatorLayout» ошибка.

код для точка 1 :

MyFragment myFragment= MyFragment.getInstance(bundle);
myFragment.show(fragment.getChildFragmentManager(),"tag");

код для точка 2 :

@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_bottomsheet, null, false);  
return rootView;
}

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

BottomSheetDialog - довольно своеобразная Dialog реализация.Он не добавляется и не опирается на *, CoordinatorLayout в макете Activity.Он устанавливает свой собственный CoordinatorLayout внутри, а внутри него FrameLayout с BottomSheetBehavior, в который помещается ваш View.BottomSheetDialog сам заполняет весь экран и имеет прозрачный фон, так что он может обрабатывать взаимодействие нижнего листа и любые внешние прикосновения.

Если вам нужен доступ к этому нижнему листу и его BottomSheetBehaviorнам нужно получить его из иерархии Dialog View.Это так же просто, как вызов findViewById(R.id.design_bottom_sheet) на Dialog, но нам нужно подождать, пока не появится Dialog, чтобы изменить BottomSheetBehavior.Кроме того, поскольку BottomSheetDialog устанавливает свой собственный BottomSheetCallback, мы должны обеспечить его надлежащую замену.То есть мы должны позаботиться об отмене Dialog, когда он достигнет закрытого состояния.Например:

final BottomSheetDialog bsd = new BottomSheetDialog(MainActivity.this);
bsd.setContentView(R.layout.your_dialog_layout);
bsd.show();

FrameLayout bottomSheet = (FrameLayout) bsd.findViewById(R.id.design_bottom_sheet);
BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(View bottomSheet, int newState) {
            // This is the crucial bit.
            if (newState == BottomSheetBehavior.STATE_HIDDEN) {
                bsd.cancel();
            }
        }

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

Если вы используете BottomSheetDialogFragment, Dialog отображается в DialogFragment onStart(), и мы можем переопределить этот метод для наших модификаций,после звонка super.Например:

public class MyFragment extends BottomSheetDialogFragment {
    public MyFragment() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.your_dialog_layout, container, false);
    }

    @Override
    public void onStart() {
        super.onStart();

        FrameLayout bottomSheet = getDialog().findViewById(R.id.design_bottom_sheet);
        BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
        behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
                @Override
                public void onStateChanged(View bottomSheet, int newState) {
                    // This is the crucial bit.
                    if (newState == BottomSheetBehavior.STATE_HIDDEN) {
                        getDialog().cancel();
                    }
                }

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

В любом случае вы можете делать почти все, что хотите, в BottomSheetCallback, если вы cancel() Dialog в onStateChanged() при newState == BottomSheetBehavior.STATE_HIDDEN.


* Кстати, это означает, что вам не нужно иметь CoordinatorLayout в вашем Activity 'макете, чтобы использовать BottomSheetDialog или BottomSheetDialogFragment, хотя яне уверен, что это ясно указано в документации или других ресурсах разработчика.

0 голосов
/ 18 ноября 2018

в вашем CoordinatorLayout у вас есть ребенок, у которого есть этот app:layout_behavior="android.support.design.widget.BottomSheetBehavior"

так что нужно сделать BottomSheetBehavior behavior = BottomSheetBehavior.from(your CoordinatorLayout child);

И на это вам нужно сделать setBottomSheetCallback. behavior.setBottomSheetCallback(...)

...