Guy*_*Guy 9 xml android android-layout bottom-sheet
我正在使用Android支持库中的Bottom Sheet,如下所示:
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" />
Run Code Online (Sandbox Code Playgroud)
我将子视图添加到LinearLayout:
bottomSheet.addView(actionButtonView);
Run Code Online (Sandbox Code Playgroud)
在我添加完子视图后,我初始化BottomSheetBehavior并展开它:
BottomSheetBehavior sheetBehavior = BottomSheetBehavior.from(bottomSheet);
sheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
Run Code Online (Sandbox Code Playgroud)
这不起作用.没有任何表现.即使我在XML中预设了LinearLayout高度,它也只是全白的.
如果我在XML中添加LinearLayout中的所有子视图,那么一切正常.当我尝试以编程方式动态添加视图时,它不起作用.
有人有类似的问题吗?
小智 3
BottomSheetBehavior 上的动态内容存在与其扩展尺寸计算的实现相关的问题。BottomSheetBehavior 在 onLayoutChild 方法中计算扩展尺寸。但是,当您更改工作表布局过程的内容时,异步启动。即使你调用RequestLayout或类似的东西。所以调用的结果是这样的:
这肯定是 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();
}
Run Code Online (Sandbox Code Playgroud)
因此,当您需要显示包含新内容的 BottomSheet 时,请调用 ShowPanel。当您需要完全隐藏 BottomSheet 时,请调用 hidePanel(如果您需要在项目中隐藏它。如果不需要,您可以从方法中删除 setVisibility)。
解决方法的想法是,当 BottomSheetBehavior 未处于展开状态时,永远不要更改 BottomSheet 的内容。如果状态未展开,只需将其更改为展开,等到动画完成后再更改内容。
| 归档时间: |
|
| 查看次数: |
1355 次 |
| 最近记录: |