Ich habe den neuen BottomSheetDialog verwendet, der in Support Library 23.2 hinzugefügt wurde, aber ich möchte die Standardhöhe des Dialogs ändern. Ich weiß, dass es wahrscheinlich mit dem Attribut behavior_peekHeight
Zu tun hat, das die Anfangshöhe steuert, aber wie stelle ich das in BottomSheetDialog
ein, wenn ich keinen direkten Zugriff auf BottomSheetBehavior
?
Sie können ein bottomSheetDialogTheme
in Ihrer Aktivität festlegen, indem Sie das behavior_peekHeight
Des bottomSheetStyle
-Attributs überschreiben:
<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>
Dieselbe Technik kann auch für andere Attribute verwendet werden, z. B. das Hinzufügen von <item name="behavior_hideable">true</item>
Zum AppModalStyle
, um zu ändern, ob das unterste Blatt ausgeblendet werden kann.
sie können BottomSheetBehavior
in Ihrem Code verwenden
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();
Eine andere Möglichkeit besteht darin, BottomSheetDialogFragment
zu erben und zu steuern, wie und wann Sie die Inhaltsansicht festlegen. Wenn Sie den Ansichtsbaum nach oben gehen, erhalten Sie das Verhalten, dass BottomSheetDialog
die Inhaltsansicht einschließt. Es ist keine wirklich gute Lösung, da es mehr Layoutdurchläufe erfordert. Es ist wichtig, dass wir den Dialog schließen müssen, wenn der Status des unteren Blattes STATE_HIDDEN
Ist, wenn wir nicht eindeutig gegen die in der Bibliothek bereitgestellte Implementierung verstoßen.
Nach dem programmgesteuerten Festlegen der Blickhöhe muss die Inhaltsansicht requestLayout()
aufrufen, was in der Tat ein weiterer Layoutdurchlauf ist.
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();
}
}
Durch die Kombination der Lösung von Nick und Litao ist dies eine vollständige Version unseres Handelns:
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();
Woks für mich
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()
}
}
So habe ich mich für das Problem entschieden:
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
}
Der Hauptteil ist die Methode setContentView(view, params)
, in der Sie die Ansicht für Ihre Dialog- und Layoutparameter festlegen, in der Sie die gewünschte Höhe festlegen.
Ich habe einen Hack bekommen und ihn benutzt.
Wenn Sie programmgesteuert ausführen möchten.
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) {
}
});
Vielen Dank.