Ich habe ein benutzerdefiniertes BttomSheetDialogFragment und ich möchte runde Ecken oben in der Ansicht von unten haben
Dies ist meine benutzerdefinierte Klasse, die mein Layout aufbläst, das ich von unten anzeigen möchte
View mView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.charge_layout, container, false);
initChargeLayoutViews();
return mView;
}
und auch ich habe diese XML-Ressourcendatei als Hintergrund:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
>
<corners android:topRightRadius="35dp"
android:topLeftRadius="35dp"
/>
<solid android:color="@color/white"/>
<padding android:top="10dp"
android:bottom="10dp"
android:right="16dp"
android:left="16dp"/>
Das Problem ist jedoch, dass die Ecken immer noch nicht abgerundet sind, wenn ich diese Ressourcendatei als Hintergrund für das Stammelement meines Layouts festlege
und ich kann den folgenden Code nicht verwenden:
this.getDialog().getWindow().setBackgroundDrawableResource(R.drawable.charge_layout_background);
Weil der Standardhintergrund von BottomSheetDialog überschrieben wird und über meiner Ansicht von unten keine halbtransparente graue Farbe angezeigt wird
android
material-design
bottom-sheet
material-components-android
material-components
Rasool Ghana
quelle
quelle
Antworten:
Erstellen Sie eine benutzerdefinierte Zeichnung
rounded_dialog.xml
:Dann außer Kraft setzen
bottomSheetDialogTheme
aufstyles.xml
die ziehbar als Hintergrund verwenden:Dadurch werden alle BottomSheetDialogs Ihrer App geändert.
quelle
rounded_dialog
&AppModalStyle
Namen nicht mit einem Hintergrund verwenden, bei dem nur die oberen Ecken abgerundet sind, da Sie nur erwarten würden, einen solchen Hintergrund mit einem unteren Blattstil zu verwenden. Wie wäre es mitbottomsheet_rounded_background
&AppBottomSheetStyle
Theme.AppCompat.Light.NoActionBar
, ändern alle meine UI-Komponenten ihre Farben und ich kann sie nicht überschreibenMit der neuen Materialkomponentenbibliothek können Sie die Form Ihrer Komponente mithilfe des
shapeAppearanceOverlay
Attributs in Ihrem Stil anpassen ( Hinweis: Es ist die Version 1.1.0 erforderlich ).Verwenden Sie einfach das
BottomSheetDialogFragment
Überschreiben deronCreateView
Methode und definieren Sie dann Ihren benutzerdefinierten Stil für Bottom Sheet-Dialoge.Definieren Sie das
bottomSheetDialogTheme
Attributstyles.xml
in Ihrem App-Thema:Dann definieren Sie einfach Ihre Lieblingsform mit
shapeAppearanceOverlay
Sie können dasselbe Verhalten erzielen, das diese Methode in Ihrem überschreibt
BottomSheetDialogFragment
(anstatt dasbottomSheetDialogTheme
in Ihrem App-Design hinzuzufügen ):In diesem Fall verwenden Sie dieses themeOverlay nur in der einzelnen
BottomSheetDialogFragment
und nicht in der gesamten App.Wichtiger Hinweis zum ERWEITERTEN STAAT :
Im erweiterten Zustand hat das BottomSheet flache Ecken . Sie können den offiziellen Kommentar in Github Repo überprüfen :
Dieses Verhalten wird von der bereitgestellt
BottomSheetBehavior
und kann nicht überschrieben werden.Es gibt jedoch eine Problemumgehung -> HAFTUNGSAUSSCHLUSS: Es kann in den nächsten Versionen nicht mehr funktionieren !!
Sie können ein hinzufügen
BottomSheetCallback
inBottomSheetDialogFragment
:quelle
Could not inflate Behavior subclass com.google.android.material.bottomsheet.BottomSheetBehavior
Das
BottomSheetDialog
ist eine Standard - weiße Hintergrundfarbe einstellen, deshalb die Ecken nicht sichtbar sind, Um ihnen zu zeigen , was Sie brauchen durch Überschreiben der Stil der den Hintergrund des Dialogs transparent zu machenBottomSheetDialog
.Definieren Sie diesen Stil in Ihrem
res/values/styles/styles.xml
Und setzen Sie diesen Stil auf Ihren BottomSheetDialog
quelle
Erstellen Sie eine Form mit dem Namen round_corners_shape
Definieren Sie einen Stil
Verwenden Sie diesen Stil auf Ihrem benutzerdefinierten BottomSheetDialogFragment wie folgt, es wird funktionieren!
quelle
Fragment
s festzulegen.Wenn Sie die letzte Version der Materialkomponente verwenden, müssen Sie nur überschreiben
ShapeAppearance.MaterialComponents.LargeComponent
(da das untere Blatt diese Form verwendet) und den gewünschten Wert festlegen:Und dann in Ihrem App-Stil einstellen:
Die Lösung von Gabriele Mariotti ist ähnlich und funktioniert auch, aber diese ist einfacher.
quelle
BottomSheetDialog
?Ich habe heute dasselbe überprüft und ja, Sie hatten Recht, wenn Sie dem Code folgen
Dies gilt für Fragmenthintergründe. Stattdessen sollten Sie die Bottomsheet-Ansicht aus dem Dialogfenster abrufen und den Hintergrund ändern. Hier ist der Code
Hier ist das untere Blatt die tatsächliche Ansicht, die Sie ändern möchten.
quelle
BottomSheetDialogFragment
so, dass Logik in deronCreateDialog
Methode istAntwort von Koma Yip von einer anderen Frage, die für mich funktioniert hat, sollten Sie versuchen.
Fügen Sie dies in Ihren Layout-XML-Stammknoten ein:
und
onCreateView()
setzen Sie dies ein:quelle
Diese Antwort gilt nur für das Problem, dass die Hintergrundfarbe
Color.TRANSPARENT
nach dem Einrichten eines Zeichnungszeichens mit abgerundetem Hintergrund für das Layout festgelegt wird.Keine der Antworten funktionierte für mich, um die Hintergrundfarbe einzustellen,
Color.TRANSPARENT
außer der überschreibendensetupDialog()
Lösung:ABER das, was
contentView
Sie hier für den Dialog eingestellt haben, ist nicht dasview
, in das SieonViewCreated()
beim Aufblasen gelangenonCreateView()
. Es bricht den Standardablauf, so Störungen ausgeben kann , wie Sie nicht verwenden könnenView Bindings
-Kotlin Android Extensions
inonViewCreated()
Also habe ich ein bisschen gezwickt, um den Hintergrund einzustellen
onActivityCreated()
:Hoffe diese Hilfe, die die gleichen Probleme bekam
quelle
Erstellen Sie eine Form zum Zeichnen. Diese wird als Hintergrund für das untere Blatt verwendet. Geben Sie den entsprechenden Wert für den Radius der oberen linken und rechten Ecke an.
Erstellen Sie nun einen Stil für "Dialogfragment des unteren Blattes".
Erstellen Sie nun eine benutzerdefinierte Klasse, die BottomSheetDilogFragment erweitert, in der Sie Ihren Stil angeben.
Verwenden Sie diese Klasse jetzt überall dort, wo Sie ein unteres Blatt mit runden Ecken haben möchten. z.B
quelle
Fügen Sie diese beiden Methoden in Ihre BottomsheetDialogFragment-Klasse ein.
Rufen Sie nun die
setDialogBorder(dialog)
Methode in dersetupDialog()
Methode Ihrer BottomsheetDialogFragment-Klasse auf.Erstellen Sie nun eine Formdatei in Ihrem Zeichenordner.
Legen Sie nun den Hintergrund für die übergeordnete Ansichtsgruppendialogansicht in der XML-Datei fest.
Getan!!
quelle
Eine andere Möglichkeit, dieses Problem zu beheben, besteht darin, BottomSheetDialog zu erweitern und eine benutzerdefinierte Klasse zu erstellen, die Ihren Anforderungen entspricht. Sie können dasselbe für die Layout-XML-Datei tun und Hintergrundinformationen oder andere erforderliche Anpassungen hinzufügen. Dies hat auch den Vorteil, dass Sie nicht von den von Android verwendeten ID-Namen (android.support.design.R.id.design_bottom_sheet) abhängig sind, während Sie den Hintergrund ändern (obwohl die Änderung des ID-Namens selten AFAIK erfolgt).
quelle
Erstellen Sie eine benutzerdefinierte Zeichnung mit abgerundeten Ecken und legen Sie sie als Hintergrund für das Layout-Stammverzeichnis Ihres BottomSheetDialogFragment fest
Fügen Sie dann einfach den folgenden Code zu Ihrer BottomSheetDialogFragment-Klasse hinzu
Sie können sogar mit den Parametern spielen, um den Rand wie unten festzulegen
quelle
Sie müssen das ändern
bottom sheet theme
, um das Top-Round-Layout zu erreichenErstellen Sie eine benutzerdefinierte zeichnbare Datei background_bottom_sheet_dialog_fragment.xml:
Überschreiben Sie dann bottomSheetDialogTheme in styles.xml mit dem Zeichen als Hintergrund:
Dadurch wird das Hintergrundlayout Ihres unteren Blattes geändert
BottomSheetDialog
quelle
Ich weiß, dass diese Frage bereits eine akzeptierte Antwort hat. Ich möchte die Probleme dokumentieren, die ich durchgemacht habe, und wie ich es endlich zum Laufen gebracht habe, damit es für jemanden in der Zukunft nützlich ist.
Erstens habe ich
Theme.AppCompat.Light.DarkActionBar
als Elternteil für unsere verwendetAppTheme
. Dies bedeutete, dass die @ Gabriele Mariotti-Lösung immer wieder mit dem Fehler abstürzteCould not inflate Behavior subclass com.google.android.material.bottomsheet.BottomSheetBehavior
. Ich habe dies behoben, indem ich einfach das übergeordnete Element in geändert habeTheme.MaterialComponents.Light.DarkActionBar
. Dies hatte keinerlei Auswirkungen auf unser Thema, aber die RTE war weg. Sie können dieses Problem auch beheben, indem Sie einfach die erforderlichen Elemente in Ihren Stil aufnehmen. Aber ich habe mich nicht darum gekümmert, herauszufinden, welche Stile von BottomSheetBehavior benötigt werden.Zweitens versuchen Sie es wie ich könnte, aber ich konnte nicht das tatsächliche Frame-Layout (das BottomSheetDialogFragment war) verwenden, um runde Ecken zu haben. Ich erkannte, dass das Setzen eines Bildes Drawable funktionierte, aber nicht mit einer Form oder einem
@null
. Es stellte sich heraus, dass der vonLinearLayout
mir verwendete Hintergrund definiert war. Dies überschrieb jeden Hintergrund im Stil. Das Entfernen führte schließlich zu abgerundeten Ecken.Außerdem musste keine Hintergrundform eingestellt werden, um die Ecken abzurunden. Die Lösung von @Gabriele Mariotti funktionierte, sobald ich die obigen Änderungen vorgenommen hatte. Um die Hintergrundfarbe so einzustellen, wie ich sie haben wollte, musste ich das Element "backgroundTint" überschreiben.
PS: Ich bin neu in der Android-Entwicklung und pflege eine alte App, die für den internen Gebrauch in unserem College entwickelt wurde. Ich bin mit dem Layoutsystem von Android oder der Materialbibliothek nicht allzu vertraut. Ich denke, deshalb habe ich 3 Tage gebraucht, um das herauszufinden. Ich hoffe, dass dies in Zukunft für jemanden nützlich ist.
quelle
Es hat bei mir funktioniert
Erstellen Sie eine Form mit dem Namen shape_rounded_dialog
füge unten Stile hinzu
In der Klasse DialogFragment gibt die Methodenüberschreibung getTheme auch den Yourself-Stil zurück.
quelle