web-dev-qa-db-ja.com

BottomSheetDialogFragmentで画面の下部にビューを固定します

プロジェクトでBottomSheetDialogFragmentを使用し、次のように設計しました。

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>

しかし、対話は次のとおりです。

BottomSheetDialog

ご覧のとおり、最初は下部のメニューが表示されていません。

誰かがこの問題を解決するのを手伝ってくれますか?

8

これを解決するために、試してみるといくつかのことが思い浮かびましたが、うまくいきませんでした。

しかし、これは最終的にこの方法で解決されました:

折りたたみモードの場合、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")

enter image description here

4