1. ホーム
  2. android

[解決済み] BottomSheetDialogFragmentの状態をexpandedに設定する。

2022-07-09 23:22:10

質問

フラグメントエクステンションの状態をどのように設定するのですか? BottomSheetDialogFragment を使って拡張したフラグメントの状態を BottomSheetBehavior#setState(STATE_EXPANDED) を使用して展開することはできますか?

https://code.google.com/p/android/issues/detail?id=202396 は言う。

BottomSheetは最初STATE_COLLAPSEDに設定されています。拡大したい場合はBottomSheetBehavior#setState(STATE_EXPANDED)を呼び出してください。ビューレイアウトの前にこのメソッドを呼び出すことはできないことに注意してください。

このメソッドは 推奨プラクティス は最初にビューを膨らませる必要がありますが、BottomSheetBehaviourをどのようにフラグメントに設定するかはわかりません( BottomSheetDialogFragment ).

View bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet);  
BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);  

どのように解決するのですか?

<ブロッククオート

"ビューレイアウトの前にこのメソッドを呼び出すことはできませんのでご注意ください。

上の文章がヒントです。

ダイアログにはリスナーが存在し、そのリスナーは一度ダイアログが 表示される . ダイアログがレイアウトされていない場合は、表示することができません。

そこで onCreateDialog() で、モーダルなボトムシートの ( BottomSheetFragment ) で、ダイアログを返す直前に (あるいは、ダイアログへの参照を得たらどこでも) 呼び出します。

// This listener's onShow is fired when the dialog is shown
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {

        // In a previous life I used this method to get handles to the positive and negative buttons
        // of a dialog in order to change their Typeface. Good ol' days.

        BottomSheetDialog d = (BottomSheetDialog) dialog;
        
        // This is gotten directly from the source of BottomSheetDialog
        // in the wrapInBottomSheet() method
        FrameLayout bottomSheet = (FrameLayout) d.findViewById(android.support.design.R.id.design_bottom_sheet);

        // Right here!
        BottomSheetBehavior.from(bottomSheet)
            .setState(BottomSheetBehavior.STATE_EXPANDED);
    }
});

私の場合、カスタム BottomSheet が判明しました。

@SuppressWarnings("ConstantConditions")
public class ShareBottomSheetFragment extends AppCompatDialogFragment {

    @NonNull @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        BottomSheetDialog dialog =
                new BottomSheetDialog(getActivity(), R.style.Haute_Dialog_ShareImage);

        dialog.setContentView(R.layout.dialog_share_image);

        dialog.findViewById(R.id.cancel).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });

        dialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                BottomSheetDialog d = (BottomSheetDialog) dialog;

                FrameLayout bottomSheet = (FrameLayout) d.findViewById(android.support.design.R.id.design_bottom_sheet);
                BottomSheetBehavior.from(bottomSheet).setState(BottomSheetBehavior.STATE_EXPANDED);
            }
        });

        SwitchCompat switchview = (SwitchCompat) dialog.findViewById(R.id.switchview);
        switchview.setTypeface(FontCache.get(dialog.getContext(), lookup(muli, NORMAL)));

        return dialog;
    }
}

これが役に立ったら教えてください。

アップデートのお知らせ

を上書きすることもできることに注意してください。 BottomSheetDialogFragment としています。

public class SimpleInitiallyExpandedBottomSheetFragment extends BottomSheetDialogFragment {

    @NonNull @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        BottomSheetDialog dialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState);

        dialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                BottomSheetDialog d = (BottomSheetDialog) dialog;

                FrameLayout bottomSheet = (FrameLayout) d.findViewById(android.support.design.R.id.design_bottom_sheet);
                BottomSheetBehavior.from(bottomSheet).setState(BottomSheetBehavior.STATE_EXPANDED);
            }
        });

        // Do something with your dialog like setContentView() or whatever
        return dialog;
    }
}

しかし、私は本当に誰もがベースとしてそれを行うことを望むのかわかりません BottomSheetFragment を返す以外には何もしません。 BottomSheetDialog .

androidx用アップデート

AndroidX を使用する場合、以前はリソースが android.support.design.R.id.design_bottom_sheet にあったリソースが com.google.android.material.R.id.design_bottom_sheet .