プロジェクトでBottomSheetDialogFragmentを使用し、次のように設計しました。
ターゲット:BottomSheetDialogの下部メニューを画面の下部に貼り付けます。どちらのモードも折りたたんで展開します。
したがって、BottomSheetDialogレイアウトでは、親にRelativeLayoutを使用し、メニューコンテナに「layout_alignParentBottom」を使用しました。以下のとおりです。
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/bottomSheetContainer"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="center_horizontal"
app:behavior_hideable="true"
app:behavior_peekHeight="0dp"
app:layout_behavior="Android.support.design.widget.BottomSheetBehavior"
tools:context=".MyBottomSheetDialogFragment">
<RelativeLayout
Android:id="@+id/topSection"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentTop="true">
....
</RelativeLayout>
<Android.support.v4.widget.NestedScrollView
Android:id="@+id/descriptionContainer"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_below="@id/topSection">
....
</Android.support.v4.widget.NestedScrollView>
<HorizontalScrollView
Android:id="@+id/iconsContainer"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true">
....
</HorizontalScrollView>
</RelativeLayout>
しかし、対話は次のとおりです。
ご覧のとおり、最初は下部のメニューが表示されていません。
誰かがこの問題を解決するのを手伝ってくれますか?
これを解決するために、試してみるといくつかのことが思い浮かびましたが、うまくいきませんでした。
しかし、これは最終的にこの方法で解決されました:
折りたたみモードの場合、bottomSheetBehaviorのpeekHeightを画面の1/3に設定します(次のコードを使用)。
View bottomSheetContainer = dialog.findViewById(R.id.bottomSheetContainer);
View parent = (View) bottomSheetContainer.getParent();
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) parent.getLayoutParams();
BottomSheetBehavior bottomSheetBehavior = (BottomSheetBehavior) params.getBehavior();
View inflatedView = View.inflate(getContext(), R.layout.Word_details_bottom_sheet, null);
inflatedView.measure(0, 0);
int screenHeight = getActivity().getResources().getDisplayMetrics().heightPixels;
if (bottomSheetBehavior != null) {
bottomSheetBehavior.setPeekHeight(screenHeight /3);
}
だから私はそれをすることにしました:
1-折りたたみモードの場合:bottomSheetコンテナの高さ= bottomSheetBehaviorのpeekHeight
2-展開モードの場合:bottomSheetコンテナの高さ=フルスクリーンの高さ
だから私は次のコード(完全なコード)を書きました:
WordDetailsBottomSheet.Java
public class WordDetailsBottomSheet extends BottomSheetDialogFragment {
public WordDetailsBottomSheet() { // Required empty public constructor }
@NotNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
BottomSheetDialog dialog = new BottomSheetDialog(getActivity(), 0);
dialog.setContentView(R.layout.Word_details_bottom_sheet);
View bottomSheetContainer = dialog.findViewById(R.id.bottomSheetContainer);
View parent = (View) bottomSheetContainer.getParent();
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) parent.getLayoutParams();
BottomSheetBehavior bottomSheetBehavior = (BottomSheetBehavior) params.getBehavior();
View inflatedView = View.inflate(getContext(), R.layout.Word_details_bottom_sheet, null);
inflatedView.measure(0, 0);
int screenHeight = getActivity().getResources().getDisplayMetrics().heightPixels;
int statusBarHeight = getStatusBarHeight();
if (bottomSheetBehavior != null) {
bottomSheetBehavior.setPeekHeight(screenHeight / BOTTOM_SHEET_PEEK_HEIGHT_PERCENT);
bottomSheetContainer.getLayoutParams().height = bottomSheetBehavior.getPeekHeight();
}
bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View view, int newState) {
switch (newState) {
case BottomSheetBehavior.STATE_EXPANDED:
bottomSheetContainer.getLayoutParams().height = screenHeight-statusBarHeight;
break;
case BottomSheetBehavior.STATE_COLLAPSED:
bottomSheetContainer.getLayoutParams().height = bottomSheetBehavior.getPeekHeight();
break;
case BottomSheetBehavior.STATE_HIDDEN:
dismiss();
break;
default:
break;
}
}
@Override
public void onSlide(@NonNull View view, float slideOffset) {
}
});
return dialog;
}
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "Android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
}
Word_details_bottom_sheet.xml
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/bottomSheetContainer"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="center_horizontal"
app:behavior_hideable="true"
app:behavior_peekHeight="0dp"
app:layout_behavior="Android.support.design.widget.BottomSheetBehavior"
tools:context=".MyBottomSheetDialogFragment">
<RelativeLayout
Android:id="@+id/topSection"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentTop="true">
....
</RelativeLayout>
<Android.support.v4.widget.NestedScrollView
Android:id="@+id/descriptionContainer"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_below="@id/topSection">
....
</Android.support.v4.widget.NestedScrollView>
<HorizontalScrollView
Android:id="@+id/iconsContainer"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true">
....
</HorizontalScrollView>
</RelativeLayout>
Xmlファイルでは、重要なことは次のとおりです。
1-親ID(Android:id = "@ + id/bottomSheetContainer")
2-iconsContainer align(Android:layout_alignParentBottom = "true")