为什么 Bottom Sheet Dialog 在平板电脑上不展开?
Why does Bottom Sheet Dialog not expand on tablet?
我已经在我的应用程序中实现了 BottomSheetDialog,但是当我将它安装在平板电脑上并将平板电脑放下时,它在第一次点击时不会完全展开。它首先展开到 Collapsed 状态,您必须将其向上拖动才能看到所有内容。为什么要这样做?您可以根据自己的风格更改某些设置吗?
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"
app:behavior_peekHeight="0dp"
>
...
</LinearLayout>
val view = layoutInflater.inflate(R.layout.home_bottom_sheet_dialog, null)
val bottomSheetDialog = BottomSheetDialog(activity!!)
bottomSheetDialog.setContentView(view)
bottomSheetDialog.show()
我使用 API 22 AndroidX 和 kotlin。
实现底部完全展开sheet有点棘手。您应该重写 BottomSheetDialogFragment class 中的 onViewCreated 方法并按如下方式收听 GlobalLayout:
(Java代码)
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
BottomSheetDialog dialog = (BottomSheetDialog) getDialog();
if (dialog != null) {
FrameLayout bottomSheet = dialog.findViewById(com.google.android.material.R.id.design_bottom_sheet);
if (bottomSheet != null) {
BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
bottomSheetBehavior.setPeekHeight(0);
bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View view1, int i) {
if (bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_COLLAPSED || bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_HIDDEN) {
if (!isStateSaved())
dismissAllowingStateLoss();
}
}
@Override
public void onSlide(@NonNull View view1, float v) {
}
});
}
}
});
}
另外不需要 xml:
中的属性
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"
app:behavior_peekHeight="0dp"
正如Sinan Ceylan所说,这部分布局不需要。
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"
app:behavior_peekHeight="0dp"
但是为了解决我的问题,我在显示之前将 BottomSheetBehavior 的 peakHeight 变量设置为较大的值。
bottomSheetDialog.setContentView(view)
bottomSheetDialog.behavior.peekHeight = 1000
bottomSheetDialog.show()
我已经在我的应用程序中实现了 BottomSheetDialog,但是当我将它安装在平板电脑上并将平板电脑放下时,它在第一次点击时不会完全展开。它首先展开到 Collapsed 状态,您必须将其向上拖动才能看到所有内容。为什么要这样做?您可以根据自己的风格更改某些设置吗?
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"
app:behavior_peekHeight="0dp"
>
...
</LinearLayout>
val view = layoutInflater.inflate(R.layout.home_bottom_sheet_dialog, null)
val bottomSheetDialog = BottomSheetDialog(activity!!)
bottomSheetDialog.setContentView(view)
bottomSheetDialog.show()
我使用 API 22 AndroidX 和 kotlin。
实现底部完全展开sheet有点棘手。您应该重写 BottomSheetDialogFragment class 中的 onViewCreated 方法并按如下方式收听 GlobalLayout:
(Java代码)
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
BottomSheetDialog dialog = (BottomSheetDialog) getDialog();
if (dialog != null) {
FrameLayout bottomSheet = dialog.findViewById(com.google.android.material.R.id.design_bottom_sheet);
if (bottomSheet != null) {
BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
bottomSheetBehavior.setPeekHeight(0);
bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View view1, int i) {
if (bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_COLLAPSED || bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_HIDDEN) {
if (!isStateSaved())
dismissAllowingStateLoss();
}
}
@Override
public void onSlide(@NonNull View view1, float v) {
}
});
}
}
});
}
另外不需要 xml:
中的属性app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior" app:behavior_peekHeight="0dp"
正如Sinan Ceylan所说,这部分布局不需要。
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior" app:behavior_peekHeight="0dp"
但是为了解决我的问题,我在显示之前将 BottomSheetBehavior 的 peakHeight 变量设置为较大的值。
bottomSheetDialog.setContentView(view)
bottomSheetDialog.behavior.peekHeight = 1000
bottomSheetDialog.show()