web-dev-qa-db-de.com

Wie ändere ich die Standardhöhe eines BottomSheetDialogs?

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?

37
ianhanniballake

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.

65
ianhanniballake

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();
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

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();
        }
}
5

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();
1
Yuchen Zhong

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()
    }
}
1
user2358763

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.

0
Vitaliy Belyaev

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.