Android支持BottomSheetBehavior不能dynamic?

我正在使用Android支持库中的底部工作表,如下所示:

XML:

<LinearLayout android:id="@+id/bottomSheetLinearLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/fourth_white" android:orientation="vertical" app:layout_behavior="android.support.design.widget.BottomSheetBehavior" /> 

我将子视图添加到LinearLayout:

 bottomSheet.addView(actionButtonView); 

在完成添加子视图之后,我初始化BottomSheetBehavior并展开它:

 BottomSheetBehavior sheetBehavior = BottomSheetBehavior.from(bottomSheet); sheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); 

这不起作用。 没有显示。 即使我在XML中预设了LinearLayout高度,也只是全白。

如果我在LinearLayout中添加所有的子视图,那么一切正常。 当我尝试以编程方式dynamic添加视图时,它不起作用。

任何人有类似的问题?

Solutions Collecting From Web of "Android支持BottomSheetBehavior不能dynamic?"

尝试发布runnable来查看消息队列:

 bottomSheet.post(new Runnable() { @Override public void run() { bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); } }); 

或与retrolambda:

 bottomSheet.post(() -> bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED)); 

与BottomSheetBehavior上的dynamic内容相关的扩展大小计算的实现有困难。 BottomSheetBehavior在onLayoutChild方法中计算扩展大小。 但是当你更改表单布局过程的内容启动asynchronous。 即使你调用RequestLayout或类似的东西。 所以调用的结果是这样的:

  1. BottomSheetBehavior具有旧的扩展大小(在你的情况下,我认为它是零)
  2. 您将内容添加到BottomSheet。 扩大的大小仍然是旧的。
  3. 您将SetState调用为EXPANDED。 BottomSheetBehavior仍然记得旧的扩展大小,并启动animation到这个大小。 状态更改为STATE_SETTLING!
  4. 调用onLayoutChild和BottomSheetBehavior计算新的扩展大小。 但animation已经在进行中,状态是STATE_SETTLING,所以BottomSheetBehavior不会改变它的大小
  5. animation完成。 BottomSheet的大小是旧的。 状态更改为EXPANDED,但BottomSheetBehavior“忘记”展开大小在animation过程中已更改。

这肯定是BottomSheetBehaviour实现的缺陷。

在我的项目中,我发现了这样的解决方法:

 private void showPanel(final View panelContent) { if (panelBehavior.getState()!=BottomSheetBehavior.STATE_EXPANDED) { panelBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { @Override public void onStateChanged(final View bottomSheet, int newState) { if (newState==BottomSheetBehavior.STATE_EXPANDED) { panelBehavior.setBottomSheetCallback(null); contentView.removeAllViews(); contentView.addView(panelContent); panelView.setVisibility(View.VISIBLE); } } @Override public void onSlide(View bottomSheet, float slideOffset) { } }); panelBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); return; } contentView.removeAllViews(); contentView.addView(panelContent); panelView.setVisibility(View.VISIBLE); } private void hidePanel() { panelBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); panelView.setVisibility(View.GONE); contentView.removeAllViews(); } 

所以当你需要用新的内容显示BottomSheet时调用ShowPanel。 当你需要完全隐藏BottomSheet时,调用hidePanel(如果你需要将它隐藏在你的项目中,如果没有,你可以从方法中删除setVisibility)。

当BottomSheetBehavior不处于展开状态时,解决方法的想法是永远不会更改BottomSheet的内容。 如果状态不扩展,只需将其改为扩展,等到animation完成后才更改内容。