Support Library 23.2 に追加された新しいBottomSheetDialogを使用しましたが、ダイアログのデフォルトの高さを変更したいです。おそらくbehavior_peekHeight
属性は初期の高さを制御しますが、BottomSheetDialog
に直接アクセスできないときにBottomSheetBehavior
に設定するにはどうすればよいですか?
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
に追加して、ボトムシートを非表示にするかどうかを変更するなど、この同じ手法を他の属性にも使用できます。
コードでBottomSheetBehavior
を使用できます
BottomSheetDialog dialog = new BottomSheetDialog(content);
.
.
.
dialog.setContentView(view);
BottomSheetBehavior mBehavior = BottomSheetBehavior.from((View) view.getParent());
mBehavior.setPeekHeight(your dialog height)
dialog.show();
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();
別の方法は、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();
}
}
_
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();
私のために
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()
}
}
これが私が問題を決定した方法です:
_ 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)
で、ダイアログのビューを設定し、希望の高さを設定するレイアウトパラメーターを設定します。
ハックを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) {
}
});
ありがとうございました。