底部 sheet 视图在 google material 库更新后无法完全展开?
Bottom sheet view not able to expand completely after google material lib update?
之前我使用的是 alpha 03 库,在应用程序启动时,我可以在其中展开底部 sheet 视图。
implementation 'com.google.android.material:material:1.1.0-alpha03'
更新到 alpha 04 之后。我发现了我之前使用的代码
不工作,只有部分视图可见。
implementation 'com.google.android.material:material:1.1.0-alpha04'
但是上下滑动之后,视野就完美展开了。
如何确保首次启动时底部sheet完全可见。之前的代码不正确吗?
这是 MainActivity 中的代码
mBottomSheetBehavior = BottomSheetBehavior.from(bottomSheetSummaryLayout);
mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
mBottomSheetBehavior.setHideable(false);
xml 底部代码 sheet 视图
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tool="http://schemas.android.com/tools"
android:id="@+id/bottom_sheet_summary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:gravity="bottom"
android:orientation="vertical"
app:behavior_hideable="true"
app:behavior_peekHeight="100dp"
app:layout_behavior="@string/bottom_sheet_behavior"
tool:behavior_peekHeight="300dp">
<androidx.viewpager.widget.ViewPager
android:id="@+id/pager_summary"
android:layout_width="match_parent"
android:layout_height="321dp"
android:layout_gravity="bottom"
android:background="@drawable/bg_transparent_gradient"
android:clipToPadding="false"
android:overScrollMode="never"
android:paddingStart="@dimen/summary_card_left_padding"
android:paddingLeft="@dimen/summary_card_left_padding"
android:paddingEnd="@dimen/summary_card_right_padding"
android:paddingRight="@dimen/summary_card_right_padding" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="@dimen/bottom_summary_bar"
android:layout_gravity="bottom"
android:background="@color/colorPrimaryDark"
app:tabBackground="@drawable/tab_selector"
app:tabGravity="center"
app:tabIndicatorHeight="0dp" />
</LinearLayout>
您是在生产中使用这个库还是在 Play 商店中部署应用程序?我建议您仅使用任何库的 stable 版本,除非非常需要 alpha 功能。
此外,每当您使用 stable 发行库以外的任何其他发行版时,请密切关注其 Github 存储库的问题跟踪器,以了解问题和可能的解决方法。
这是 Github changelog for every version of Material Components Android 存储库。您应该阅读变更日志并决定是否要在不稳定或列出问题的风险下获得这些 alpha 功能。
此外,Github 存储库中包含一个比较页面,您可以在其中比较任意两个版本的更改。请参阅此页面 here。
比较的第二行 table 提到了对 setHideable 行为的更改。阅读更多 here.
setHideable(false) on hidden bottom sheet animates to collapsed state
删除 setHideable() 并查看它是否按预期工作。
试试下面的代码,我在我的一个项目中使用过,你可能会得到帮助
public class PopUpFragment extends BottomSheetDialogFragment {
@NonNull @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
BottomSheetDialog dialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState);
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(final DialogInterface dialog) {
BottomSheetDialog d = (BottomSheetDialog) dialog;
bottomSheet = (FrameLayout) d.findViewById(android.support.design.R.id.design_bottom_sheet);
BottomSheetBehavior mBottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);
mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
mBottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View view, int i) {
switch (i){
case BottomSheetBehavior.STATE_HIDDEN:
dialog.dismiss();
break;
default:
break;
}
}
@Override
public void onSlide(@NonNull View view, float v) {
setScrim(v);
}
});
}
});
// Do something with your dialog like setContentView() or whatever
return dialog;
}
private void setScrim(float slideOffset) {
// bottomSheet.getForeground().setAlpha((int) (slideOffset * 150));
}
public static PopUpFragment newInstance() {
PopUpFragment fragment = new PopUpFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.your_layou, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
}
显示 BottomSheet
PopUpFragment bottomDialogFragment =
PopUpFragment.newInstance();
bottomDialogFragment.show(getChildFragmentManager(),"PopUpFragment");
之前我使用的是 alpha 03 库,在应用程序启动时,我可以在其中展开底部 sheet 视图。
implementation 'com.google.android.material:material:1.1.0-alpha03'
更新到 alpha 04 之后。我发现了我之前使用的代码 不工作,只有部分视图可见。
implementation 'com.google.android.material:material:1.1.0-alpha04'
但是上下滑动之后,视野就完美展开了。
如何确保首次启动时底部sheet完全可见。之前的代码不正确吗?
这是 MainActivity 中的代码
mBottomSheetBehavior = BottomSheetBehavior.from(bottomSheetSummaryLayout);
mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
mBottomSheetBehavior.setHideable(false);
xml 底部代码 sheet 视图
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tool="http://schemas.android.com/tools"
android:id="@+id/bottom_sheet_summary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:gravity="bottom"
android:orientation="vertical"
app:behavior_hideable="true"
app:behavior_peekHeight="100dp"
app:layout_behavior="@string/bottom_sheet_behavior"
tool:behavior_peekHeight="300dp">
<androidx.viewpager.widget.ViewPager
android:id="@+id/pager_summary"
android:layout_width="match_parent"
android:layout_height="321dp"
android:layout_gravity="bottom"
android:background="@drawable/bg_transparent_gradient"
android:clipToPadding="false"
android:overScrollMode="never"
android:paddingStart="@dimen/summary_card_left_padding"
android:paddingLeft="@dimen/summary_card_left_padding"
android:paddingEnd="@dimen/summary_card_right_padding"
android:paddingRight="@dimen/summary_card_right_padding" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="@dimen/bottom_summary_bar"
android:layout_gravity="bottom"
android:background="@color/colorPrimaryDark"
app:tabBackground="@drawable/tab_selector"
app:tabGravity="center"
app:tabIndicatorHeight="0dp" />
</LinearLayout>
您是在生产中使用这个库还是在 Play 商店中部署应用程序?我建议您仅使用任何库的 stable 版本,除非非常需要 alpha 功能。
此外,每当您使用 stable 发行库以外的任何其他发行版时,请密切关注其 Github 存储库的问题跟踪器,以了解问题和可能的解决方法。
这是 Github changelog for every version of Material Components Android 存储库。您应该阅读变更日志并决定是否要在不稳定或列出问题的风险下获得这些 alpha 功能。
此外,Github 存储库中包含一个比较页面,您可以在其中比较任意两个版本的更改。请参阅此页面 here。
比较的第二行 table 提到了对 setHideable 行为的更改。阅读更多 here.
setHideable(false) on hidden bottom sheet animates to collapsed state
删除 setHideable() 并查看它是否按预期工作。
试试下面的代码,我在我的一个项目中使用过,你可能会得到帮助
public class PopUpFragment extends BottomSheetDialogFragment {
@NonNull @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
BottomSheetDialog dialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState);
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(final DialogInterface dialog) {
BottomSheetDialog d = (BottomSheetDialog) dialog;
bottomSheet = (FrameLayout) d.findViewById(android.support.design.R.id.design_bottom_sheet);
BottomSheetBehavior mBottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);
mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
mBottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View view, int i) {
switch (i){
case BottomSheetBehavior.STATE_HIDDEN:
dialog.dismiss();
break;
default:
break;
}
}
@Override
public void onSlide(@NonNull View view, float v) {
setScrim(v);
}
});
}
});
// Do something with your dialog like setContentView() or whatever
return dialog;
}
private void setScrim(float slideOffset) {
// bottomSheet.getForeground().setAlpha((int) (slideOffset * 150));
}
public static PopUpFragment newInstance() {
PopUpFragment fragment = new PopUpFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.your_layou, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
}
显示 BottomSheet
PopUpFragment bottomDialogFragment =
PopUpFragment.newInstance();
bottomDialogFragment.show(getChildFragmentManager(),"PopUpFragment");