bottomSheetDialogFragment Vollbild

Lesezeit: 6 Minuten

Benutzer-Avatar
Abdel

Was ich erreichen möchte, ist so etwas wie ein In-App-Webbrowser von Instagram, der verwendet wird, wenn Sie auf eine Anzeige klicken:

Instagram-Webbrowser

Was ich getan habe, ist, dass ich ein BottomSheetDialogFragment von WebView verwendet und überschrieben habe onCreateDialog So erhalten Sie den Vollbildmodus:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    BottomSheetDialog bottomSheetDialog=(BottomSheetDialog)super.onCreateDialog(savedInstanceState);
    bottomSheetDialog.setOnShowListener(dialog -> {
        BottomSheetDialog dialogc = (BottomSheetDialog) dialog;
        FrameLayout bottomSheet =  dialogc .findViewById(android.support.design.R.id.design_bottom_sheet);
        BottomSheetBehavior.from(bottomSheet).setState(BottomSheetBehavior.STATE_EXPANDED);
        //BottomSheetBehavior.from(bottomSheet).setSkipCollapsed(true);
        //BottomSheetBehavior.from(bottomSheet).setHideable(true);
    });
    return bottomSheetDialog;
}

hier ist das Ergebnis, das ich bekomme:

Webbrowser

Meine Frage ist, wie kann ich den Vollbildeffekt erzielen oder wie kann ich so etwas wie einen Instagram-Browser erreichen?

ps: Ich habe zuerst benutzerdefinierte Chrome-Tabs ausprobiert, aber ich konnte sie nicht in das Dialogfragment einfügen.

Vielen Dank.

  • Richtige Lösung: stackoverflow.com/questions/33644326/…

    – ATES

    20. Mai 2021 um 22:15 Uhr

In Ihrem Brauch BottomSheetDialogFragment Sie können etwas verwenden wie:

  @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.setOnShowListener(new DialogInterface.OnShowListener() {
      @Override public void onShow(DialogInterface dialogInterface) {
        BottomSheetDialog bottomSheetDialog = (BottomSheetDialog) dialogInterface;
        setupFullHeight(bottomSheetDialog);
      }
    });
    return  dialog;
  }


  private void setupFullHeight(BottomSheetDialog bottomSheetDialog) {
    FrameLayout bottomSheet = (FrameLayout) bottomSheetDialog.findViewById(R.id.design_bottom_sheet);
    BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
    ViewGroup.LayoutParams layoutParams = bottomSheet.getLayoutParams();

    int windowHeight = getWindowHeight();
    if (layoutParams != null) {
      layoutParams.height = windowHeight;
    }
    bottomSheet.setLayoutParams(layoutParams);
    behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
  }

  private int getWindowHeight() {
    // Calculate window height for fullscreen use
    DisplayMetrics displayMetrics = new DisplayMetrics();
    ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    return displayMetrics.heightPixels;
  }

  • Funktioniert bei mir nicht. Bringt mich nur zu etwa 70% auf den Bildschirm. Irgendwelche Vorschläge?

    – Code Wiget

    26. März 2020 um 20:43 Uhr

  • @CodeWiget könnte daran liegen, dass der Inhalt Ihres unteren Blatts nicht groß genug ist, um sich über den gesamten Bildschirm zu erstrecken

    – AsafK

    7. Mai 2020 um 14:04 Uhr

  • Wenn Sie die volle Höhe ohne Statusleiste benötigen, sollten Sie Folgendes aufrufen: (Kontext als Activity).findViewById(Window.ID_ANDROID_CONTENT).height

    – G00fY

    13. Mai 2020 um 14:08 Uhr


  • Es ist eine Art feste Größe für die Inhaltsansicht.

    – Ken Zira

    23. Mai 2020 um 16:57 Uhr


  • Diejenigen, die nicht zugreifen können android.support.design.R.id.design_bottom_sheet kann folgendes versuchen: com.google.android.material.R.id.design_bottom_sheet

    – Egemen Hamutçu

    7. Juli 2020 um 10:07 Uhr

Entschuldigen Sie die späte Antwort, aber in Ihrem benutzerdefinierten BottomSheetDialogFragment können Sie festlegen match_parent um die Parameter der unteren Blattansicht wie folgt zu gestalten:

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    val dialog = BottomSheetDialog(requireContext(), theme)
    dialog.setOnShowListener {

        val bottomSheetDialog = it as BottomSheetDialog
        val parentLayout =
            bottomSheetDialog.findViewById<View>(com.google.android.material.R.id.design_bottom_sheet)
        parentLayout?.let { it ->
            val behaviour = BottomSheetBehavior.from(it)
            setupFullHeight(it)
            behaviour.state = BottomSheetBehavior.STATE_EXPANDED
        }
    }
    return dialog
}

private fun setupFullHeight(bottomSheet: View) {
    val layoutParams = bottomSheet.layoutParams
    layoutParams.height = WindowManager.LayoutParams.MATCH_PARENT
    bottomSheet.layoutParams = layoutParams
}

Höhe einstellen auf match_parent hilft Ihrem Dialog, über dem Einschub der Navigationsleiste gezeichnet zu werden

Benutzer-Avatar
Natig Babayev

Sie können es durch Einstellung tun peekHeight von BottomSheetBehavior gleich sein Resources.getSystem().getDisplayMetrics().heightPixels:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    BottomSheetDialog bottomSheetDialog=(BottomSheetDialog)super.onCreateDialog(savedInstanceState);
    bottomSheetDialog.setOnShowListener(dialog -> {
        BottomSheetDialog dialogc = (BottomSheetDialog) dialog;
        // When using AndroidX the resource can be found at com.google.android.material.R.id.design_bottom_sheet
        FrameLayout bottomSheet =  dialogc.findViewById(android.support.design.R.id.design_bottom_sheet);

        BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);
        bottomSheetBehavior.setPeekHeight(Resources.getSystem().getDisplayMetrics().heightPixels);
        bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
    });
    return bottomSheetDialog;
}

  • Dies war für mich die bessere Lösung, die akzeptierte Antwort versetzt den unteren Rand des Dialogs und macht kt teilweise nicht sichtbar

    – Kennedy

    7. Juni 2020 um 15:02 Uhr

  • Bei Verwendung von AndroidX finden Sie die Ressource unter com.google.android.material.R.id.design_bottom_sheet

    – Tobliug

    29. Juni 2020 um 15:07 Uhr

  • Verwenden Sie einfach R.id.design_bottom_sheet, in meinem Fall muss kein vollständiges Paket angegeben werden.

    – Faizan Haidar Khan

    6. Mai 2021 um 5:25 Uhr

Vorgeschlagene Lösungen basieren auf der Verwendung eines internen idda es nicht absichtlich exponiert ist, kann es sich ohne Vorwarnung ändern.

Meine Lösung hat die Layouthöhe auf die eingestellt FrameLayout aber auf abstraktere Weise, also wenn es sich ändert, sollte es nicht kaputt gehen, selbst wenn die ViewGroup Typ ändern.

override fun onStart() {
    super.onStart()
    val sheetContainer = requireView().parent as? ViewGroup ?: return
    sheetContainer.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT
}

Schaut man sich die an BottomSheetDialog das private View wrapInBottomSheet Methode werden Sie sehen, dass dies geschieht, um das Blattverhalten zu garantieren. Durch zusätzliches Debuggen konnte ich das Fragment erkennen View ist das direkte Kind von FrameLayout jeder findet nach id.

Auf diese Weise müssen Sie sich nicht auf die ID verlassen. Ich benutze onStart weil an dem Punkt definiert ist, an dem das Fragment für Interaktionen bereit ist, also sollte alles bereit sein.

Und wenn Sie es von Anfang an in voller Höhe brauchen (höchstwahrscheinlich)

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    return BottomSheetDialog(requireContext(), theme).apply {
        behavior.state = BottomSheetBehavior.STATE_EXPANDED
        behavior.peekHeight = //your harcoded or dimen height
    }
}

Benutzer-Avatar
Stapel Fuchs

Der beste Weg dazu ist XML

Passen Sie das Standard-BottomSheet an, indem Sie seine Attribute überschreiben, z. B. in styles.xml

<style name="Widget.MyApp.BottomSheet.Modal" parent="Widget.MaterialComponents.BottomSheet.Modal">
    <item name="behavior_skipCollapsed">true</item>
    <item name="behavior_fitToContents">true</item>
    <item name="behavior_peekHeight">1000dp</item> // yep, that helped to skip collapsed state at initial
    <item name="behavior_hideable">true</item>
</style>

Gehen Sie zu Widget.MaterialComponents.BottomSheet.Modal, um zu sehen, welche Einstellungen Sie ändern können.

Erstellen Sie dann ein benutzerdefiniertes Design, das von Theme.Design.BottomSheetDialog geerbt wurde, und legen Sie fest, dass Sie den Stil des unteren Blatts mit Ihrem eigenen überschreiben möchten. Kann auch in styles.xml platziert werden

<style name="Theme.MyApp.BottomSheetDialog" parent="Theme.Design.BottomSheetDialog">
    <item name="bottomSheetStyle">@style/Widget.MyApp.BottomSheet.Modal</item>
</style>

Definieren Sie zuletzt Ihr neu erstelltes Design für den unteren Blattdialog im Design Ihrer Aktivität oder im Design Ihrer Anwendung, das in der Datei themes.xml platziert ist (ich hoffe, Sie folgen den Empfehlungen von Google zu Verpackungsstilen und -designs).

<style name="Base.Theme.MyApp" parent="Base.Theme.Root">
    ... too many other things
    <item name="bottomSheetDialogTheme">@style/Theme.MyApp.BottomSheetDialog</item>

  • Tolle Lösung, funktioniert wie erwartet.

    – Dragan Stojanov

    27. November 2020 um 1:44 Uhr

Benutzer-Avatar
Shubham Suryavanshi

So machen Sie es in Kotlin:

val dialog = super.onCreateDialog(savedInstanceState)
dialog.setOnShowListener {
    val bottomSheetDialog = it as BottomSheetDialog
    val parentLayout = bottomSheetDialog.findViewById<View>(
        com.google.android.material.R.id.design_bottom_sheet
    )
    parentLayout?.let { bottomSheet ->
        val behaviour = BottomSheetBehavior.from(bottomSheet)
        val layoutParams = bottomSheet.layoutParams
        layoutParams.height = WindowManager.LayoutParams.MATCH_PARENT
        bottomSheet.layoutParams = layoutParams
        behaviour.state = BottomSheetBehavior.STATE_EXPANDED
    }
}
return dialog

  • Tolle Lösung, funktioniert wie erwartet.

    – Dragan Stojanov

    27. November 2020 um 1:44 Uhr

Benutzer-Avatar
AliSch

Sie können dies tun, indem Sie den Status Ihres Dialogs auf ändern STATE_EXPANDED:

BottomSheetDialog dialog = (BottomSheetDialog) getDialog();
dialog.getBehavior().setState(BottomSheetBehavior.STATE_EXPANDED);

Kotlin:

val dialog = dialog as BottomSheetDialog
dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED

  • es dauert nur etwa die halbe Breite

    – Benutzer924

    27. August 2021 um 11:50 Uhr

  • Funktioniert gut Danke.

    – Islam Alshnawey

    4. Januar um 10:42

1105970cookie-checkbottomSheetDialogFragment Vollbild

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy