Was ich erreichen möchte, ist so etwas wie ein In-App-Webbrowser von Instagram, der verwendet wird, wenn Sie auf eine Anzeige klicken:
Was ich getan habe, ist, dass ich ein BottomSheetDialogFragment von WebView verwendet und überschrieben habe onCreateDialog So erhalten Sie den Vollbildmodus:
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
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)
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
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
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
AliSch
Sie können dies tun, indem Sie den Status Ihres Dialogs auf ändern STATE_EXPANDED:
Richtige Lösung: stackoverflow.com/questions/33644326/…
– ATES
20. Mai 2021 um 22:15 Uhr