4

我想做的事

在 aBottomSheetDialogFragment中,我想膨胀一个始终停留在屏幕底部的视图,无论它处于什么状态(折叠/展开)BottomSheetBehavior

我做了什么

在 的子类中BottomSheetDialogFragment,我从 XML 扩展视图并将其添加为CoordinatorLayout(它是BottomSheetDialogFragment的父级的父级)的子级:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    setupBottomBar(getView());
}

private void setupBottomBar (View rootView) {
    CoordinatorLayout parentView = (CoordinatorLayout) ((FrameLayout)rootView.getParent()).getParent();
    parentView.addView(LayoutInflater.from(getContext()).inflate(R.layout.item_selection_bar, parentView, false), -1);
}

代码运行没有错误。
而当我使用 Layout Inspector 查看 View 层次结构时,视图结构也是正确的:

布局检查器截图

您也可以在此处下载布局检查器结果,并使用您自己的 Android Studio 打开它。

问题

但是,即使它作为 的最后一个孩子插入CoordinatorLayout,它仍然被BottomSheetDialogFragment.
当我慢慢向下滚动BottomSheetDialogFragemnt(从折叠状态到隐藏状态)时,我终于可以看到我想要在片段后面充气的视图。

查看已屏蔽

为什么会这样?

答案

正如@GoodDev 正确指出的那样,这是因为根视图(design_bottom_sheet)已被设置为 Z 平移BottomSheetDialog
这提供了一个重要信息 -不仅视图层次结构中的序列将决定其可见性,而且还决定其 Z 平移。

最好的方法是获取 Z 值design_bottom_sheet并将其设置为底部栏布局。

private void setupBottomBar (View rootView) {
    CoordinatorLayout parentView = (CoordinatorLayout) (rootView.getParent().getParent());
    View barView = LayoutInflater.from(getContext()).inflate(R.layout.item_selection_bar, parentView, false);
    ViewCompat.setTranslationZ(barView, ViewCompat.getZ((View)rootView.getParent()));
    parentView.addView(barView, -1);
}
4

2 回答 2

2

编辑 2

好的,现在我看到了你的要求,试试这个:

private void setupBottomBar (View rootView) {
    CoordinatorLayout parentView = (CoordinatorLayout) ((FrameLayout)rootView.getParent()).getParent();
    View view = LayoutInflater.from(getContext()).inflate(R.layout.item_selection_bar, parentView, false);
    // using TranslationZ to put the view on top of bottom sheet layout
    view.setTranslationZ(100);
    parentView.addView(view, -1);
}

编辑:

好的,我检查了你的布局并检查了BottomSheetDialogFragment源代码,找到了原因:

BottomSheetDialogFragment使用BottomSheetDialog对话框中,BottomSheetDialog中的方法setContentView用于将内容视图置于布局中。所以你需要覆盖's来解决你的问题。wrapInBottomSheetR.id.design_bottom_sheetBottomSheetDialogFragmentpublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)

或者,将您的setupBottomBar方法更改为:

private void setupBottomBar (View rootView) {
    FrameLayout frame = (FrameLayout)rootView.getParent();
    frame.addView(LayoutInflater.from(getContext()).inflate(R.layout.item_selection_bar, frame, false), -1);
}

并在您的item_selection_bar布局文件中,更改高度和 layout_gravity:

<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_gravity="bottom"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

BottomSheetDialogFragment文档说:模态底页。这是 DialogFragment 的一个版本,它使用BottomSheetDialog而不是浮动对话框显示底部工作表。

所以BottomSheetDialogFragmentis a Dialog,Dialog是一个浮动视图,所以在显示时会覆盖 Activity 内容BottomSheetDialogFragment

于 2018-02-28T09:26:43.243 回答
1

@goodev 给出了一个很好的答案。

你的问题

View 的Z位置导致了这个问题。虽然 TextView 是最后一个位置,但您仍然看不到它。

在此处输入图像描述 在此处输入图像描述

怎么解决

您可以设置design_sheet_bottom's Z为 TextView。

 private void setupBottomBar (View rootView) {
    CoordinatorLayout parentView = (CoordinatorLayout) ((FrameLayout)rootView.getParent()).getParent();
    View view = LayoutInflater.from(getContext()).inflate(R.layout.item_selection_bar, parentView, false);
    view.setZ(((View)rootView.getParent()).getZ());
    parentView.addView(view, -1);
}

而且我认为上面的方式很无聊,你能把你的两个视图RecyclerViewTextView一个布局吗?onCreateView()然后你可以在方法中一起膨胀主题。

于 2018-02-28T13:16:45.803 回答