web-dev-qa-db-ja.com

BottomSheetDialogのデフォルトの高さを変更するにはどうすればよいですか?

Support Library 23.2 に追加された新しいBottomSheetDialogを使用しましたが、ダイアログのデフォルトの高さを変更したいです。おそらくbehavior_peekHeight属性は初期の高さを制御しますが、BottomSheetDialogに直接アクセスできないときにBottomSheetBehaviorに設定するにはどうすればよいですか?

37
ianhanniballake

bottomSheetDialogTheme属性のbehavior_peekHeightをオーバーライドして、アクティビティにbottomSheetStyleを設定できます。

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  <item name="bottomSheetDialogTheme">@style/AppBottomSheetDialogTheme</item>
</style>

<style name="AppBottomSheetDialogTheme"
       parent="Theme.Design.Light.BottomSheetDialog">
  <item name="bottomSheetStyle">@style/AppModalStyle</item>
</style>

<style name="AppModalStyle"
       parent="Widget.Design.BottomSheet.Modal">
  <item name="behavior_peekHeight">@dimen/custom_peek_height</item>
</style>

<item name="behavior_hideable">true</item>AppModalStyleに追加して、ボトムシートを非表示にするかどうかを変更するなど、この同じ手法を他の属性にも使用できます。

65
ianhanniballake

コードでBottomSheetBehaviorを使用できます

BottomSheetDialog dialog = new BottomSheetDialog(content);
.
.
.
dialog.setContentView(view);
BottomSheetBehavior mBehavior = BottomSheetBehavior.from((View) view.getParent());
mBehavior.setPeekHeight(your dialog height)
dialog.show();
23
litao

styles.xml

<style name="BottomSheetDialog" parent="Theme.Design.Light.BottomSheetDialog">
    <item name="bottomSheetStyle">@style/bottomSheetStyleWrapper</item>
</style>

<style name="bottomSheetStyleWrapper" parent="Widget.Design.BottomSheet.Modal">
    <item name="behavior_peekHeight">500dp</item>
</style>

BottomSheetDialog dialog = new BottomSheetDialog(this, R.style.BottomSheetDialog);
            dialog.setContentView(R.layout.layout_bottom_sheet);
            dialog.show();
13
Fang

別の方法は、BottomSheetDialogFragmentを継承し、コンテンツビューを設定する方法とタイミングを制御することです。ビューツリーを上に移動すると、BottomSheetDialogがコンテンツビューをラップする動作を取得できます。それは、より多くのレイアウトパスを必要とするため、本当に良いソリューションではありません。一番下のシートの状態が_STATE_HIDDEN_の場合、ライブラリで提供されている実装に明らかに違反していない場合、ダイアログを閉じる必要があります。

プログラムによってピークの高さを設定した後、コンテンツビューはrequestLayout()を呼び出す必要があります。これは実際には別のレイアウトパスです。

_public class CustomBottomSheetDialogFragment extends BottomSheetDialogFragment {


    private BottomSheetBehavior.BottomSheetCallback mBottomSheetBehaviorCallback = new BottomSheetBehavior.BottomSheetCallback() {

        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            setStateText(newState);
            if (newState == BottomSheetBehavior.STATE_HIDDEN) {
                dismiss();
            }

        }

        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {
        }
    };

@Override
    public void setupDialog(Dialog dialog, int style) {
        super.setupDialog(dialog, style);
        View contentView = View.inflate(getContext(), R.layout.bottom_sheet_dialog_content_view, null);
        dialog.setContentView(contentView);
        mBottomSheetBehavior = BottomSheetBehavior.from(((View) contentView.getParent()));
        if (mBottomSheetBehavior != null) {
           mBottomSheetBehavior.setBottomSheetCallback(mBottomSheetBehaviorCallback);    
           mBottomSheetBehavior.setPeekHeight(peekHeight);
           contentView.requestLayout();
        }
}
_
5

Nickとlitaoのソリューションを組み合わせた、これは私たちが行うことの完全なバージョンです。

 BottomSheetDialog bottomSheet = new BottomSheetDialog(context);
 View view = View.inflate(context, R.layout.your_action_sheet, null);
 bottomSheet.setContentView(view);
 BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(((View) view.getParent()));
 bottomSheetBehavior.setPeekHeight(1000);
 bottomSheet.show();
1
Yuchen Zhong

私のために

  override fun onStart() {
    super.onStart()
    dialog?.also {
        val bottomSheet = dialog.findViewById<View>(R.id.design_bottom_sheet)
        bottomSheet.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT
        val behavior = BottomSheetBehavior.from<View>(bottomSheet)
        behavior.peekHeight = resources.displayMetrics.heightPixels //replace to whatever you want
        view?.requestLayout()
    }
}
1
user2358763

これが私が問題を決定した方法です:

_   override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val dialog = BottomSheetDialog(context)
        val view = View.inflate(context, R.layout.bottom_dialog, null)

        val heightInPixels = 500
        val params = ViewGroup.LayoutParams(MATCH_PARENT, heightInPixels)

        dialog.setContentView(view, params)

        return dialog
    }
_

主な部分はメソッドsetContentView(view, params)で、ダイアログのビューを設定し、希望の高さを設定するレイアウトパラメーターを設定します。

0
Vitaliy Belyaev

ハックを1つ取得して使用しました。

プログラムで行う場合。

    behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull View view, int i) {
            behavior.setPeekHeight(yourMinHeight);
        }

        @Override
        public void onSlide(@NonNull View view, float v) {

        }
    });

ありがとうございました。