我使用BottomSheetDialog,我必须获得行为,以便可以设置setBottomSheetCallback()来处理一些事情。
因为google says我不得不在parentview上设置coordinator并添加行为。我在main activity(根活动)中定义了coordinator布局,如下所示:

<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的要点:
我把我的BottonSheetFragments展示成这样:
我在oncreateview(不在setupdialog()中)中扩展了BottomSheetDialog,以便能够在内部添加视图寻呼机。您可能知道,如果在onsetupdialog()中对视图充气,viewpager不会附加到bottonsheetdialog。
不管怎样,我都无法从父母那里得到协调人的行为。
在我的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;
}

最佳答案

BottomSheetDialog是一个相当特殊的Dialog实现。它不会添加到CoordinatorLayout布局中的Activity中,也不依赖于它。它在内部设置自己的CoordinatorLayout,在内部设置一个带有FrameLayoutBottomSheetBehavior,将您的View放入其中。BottomSheetDialog本身填充了整个屏幕,并且有一个透明的背景,因此它可以处理底部的工作表交互和任何外部接触。
如果您需要访问底页及其BottomSheetBehavior,我们需要从DialogView层次结构中获取它。这就像在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显示在DialogFragmentonStart()中,并且我们可以在调用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) {}
            }
        );
    }
}

在这两种情况下,只要在BottomSheetCallbackcancel()中的Dialog就可以在onStateChanged()中做任何您想做的事情。
*顺便说一下,这意味着您不必在newState == BottomSheetBehavior.STATE_HIDDEN布局中使用CoordinatorLayoutActivity,尽管我不确定文档或其他开发人员资源中的任何地方都清楚这一点。

08-18 01:39